我创建了一个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
但每当我包含原始头文件时,它都能正常工作。
可能是什么问题?它使用最小和原始头文件编译好(即使用-Wall
也没有警告)。
答案 0 :(得分:5)
这不起作用并且违反单定义规则:每个类必须只有一个定义,每个翻译单元必须看到完全相同的定义,否则您的程序会生病 - 形成,更糟糕的是,不需要诊断。
使用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(); }
请参阅Herb Sutter的GotW #101,了解PIMPL类的通用框架。
答案 1 :(得分:0)
您不能从接口中删除类的私有/受保护部分:使用接口的编译器必须知道(私有/受保护)成员变量和虚函数,否则它会错误地了解类实例和虚拟表。