hou*_*oft 0 c++ header-files static-libraries osx-lion
我创建了一个C++类,我将它放在自己的静态库中.
我还决定创建一个最小的头文件,允许其他人看到public:该类的一部分.所以我基本上采用了原始的头文件(相当长,包含类private:和public:部分类等),并删除除了public:部分之外的所有内容(简短,只有构造函数/析构函数和一个公共函数).
为了测试我已经创建了一个使用该库的虚拟项目.问题是,每当我在该项目中使用最小头文件时,它就会崩溃,例如:
test(44349) malloc: *** error for object 0x7fdab2c242e8: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
但每当我包含原始头文件时,它都可以正常工作.
可能是什么问题呢?它-Wall使用最小和原始头文件编译好(即使没有警告).
这不起作用并且违反了一个定义规则:每个类必须只有一个定义,并且每个翻译单元必须看到完全相同的定义,否则您的程序是不正确的,更糟糕的是,不需要诊断.
使用PIMPL惯用法可能会更好,通过它可以将类拆分为两部分,而不需要公开实现组件:
// Ship this:
class FooImpl;
class Foo
{
std::unique_ptr<FooImpl> impl;
public:
Foo();
void do_magic();
};
// Don't ship this:
class FooImpl { void magic(); };
void FooImpl::magic() { /* secret code */ }
Foo::Foo() : impl(new FooImpl) { }
void Foo::do_magic() { impl->magic(); }
Run Code Online (Sandbox Code Playgroud)
有关PIMPL类的一个很好的通用框架,请参阅Herb Sutter的GotW#101.