2

ソースを .o ファイルにコンパイルし、"ar rcs libMyLibrarylib.a *.o" を使用してライブラリを作成した後、メンバー変数とプライベート関数がストライプ化されたヘッダー ファイルを使用しているため、segfault が発生します。まったく同じヘッダーを使用すると、エラーは発生しません。マップ内のポインターを削除すると、セグメンテーション違反が発生します。

ライブラリの作成に使用されるヘッダー

#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();
}

正確なヘッダー ファイルを使用しない場合、スライシングまたは何かがありますか? ライブラリを使用している人からTypeの #include を隠したい。

ライブラリの単体テストがあります。セグメンテーション違反はしませんが、コンパイルに使用したものと同じヘッダー ファイルを使用します。

4

2 に答える 2

6

これは不正なプログラムであり、未定義の動作を実行しています。クラス定義は、プログラム内の翻訳単位全体でまったく同じでなければなりません - 3.2 1 つの定義ルール [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

于 2013-02-13T22:51:06.497 に答える
1

クライアント コードでは、オブジェクトのサイズが異なります。これにより、オブジェクトがスタックまたはヒープに割り当てられるときにメモリが上書きされます。

于 2013-02-13T22:53:26.143 に答える