在将源代码编译为.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();
}
没有使用确切的头文件时是否有切片或其他内容?我想隐藏任何使用lib的 Type 的#include。
我对库进行了单元测试,它不会出现段错误,但它使用与编译它时相同的头文件。
答案 0 :(得分:6)
这是一个不正确的程序,你正在遇到未定义的行为。程序中的翻译单元的类定义必须完全相同 - 根据 3.2一个定义规则[basic.def.odr] \ 6 。
要隐藏Type的包含,您可以使用PIMPL惯用语而不是诉诸于这些类型的黑客。
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
的前瞻声明。
答案 1 :(得分:1)
在客户端代码中,您的对象具有不同的大小。当在堆栈中或堆中分配对象时,这将覆盖内存。