2

在将源代码编译为 .o 文件并使用“ar rcs libMyLibrarylib.a *.o”创建库后,我遇到了段错误,因为我使用的是带有成员变量和私有函数的头文件。当我使用完全相同的标题时,我没有得到错误。删除地图中的指针时会发生段错误。

用于创建库的标头

#include <**Type**>
class A
{
   public:
    A();
    ~A(); //In the destructor I iterate through the map to free everything before
    void function();
   private:
    void privateFunction();
    std::map<**Type**, int*> myMap;
}

与编译库一起使用的头文件

class A
{
   public:
    A();
    ~A();
    void function();
}

不使用确切的头文件时是否有切片或其他东西?我想对使用该库的任何人隐藏类型的#include。

我对该库进行了单元测试,它没有段错误,但它使用与编译它相同的头文件。

4

2 回答 2

6

那是一个格式错误的程序,您遇到了未定义的行为。程序中的翻译单元的类定义必须完全相同- 根据3.2 一个定义规则 [basic.def.odr] \6

要隐藏 Type 的包含,您可以只使用 PIMPL 成语,而不是诉诸这些类型的 hack。

class AImpl;
class A
{
   public:
    A();
    ~A(); //In the destructor I iterate through the map to free everything before
    void function();
   private:
    AImpl* pImpl;
}

您只需将所有逻辑和数据成员移动到内部AImpl并尽可能保持公共接口干净。您所需要的只是AImpl.

于 2013-02-13T22:51:06.497 回答
1

在客户端代码中,您的对象具有不同的大小。当对象在堆栈或堆中分配时,这将覆盖内存。

于 2013-02-13T22:53:26.143 回答