0

我制作了一个 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它使用最小和原始头文件都可以很好地编译(即使使用 也没有警告)。

4

2 回答 2

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 类的通用框架。

于 2012-07-24T22:18:37.797 回答
0

您不能从接口中删除类的私有/受保护部分:使用该接口的编译器必须知道(私有/受保护)成员变量和虚函数,否则会对类实例和虚表有错误的认识.

于 2012-07-24T22:12:43.430 回答