0

私のコードには 2 つのクラスが含まれています。

  class points{
            char *p;
    public: points(){cout<<"constructor points called"<<endl;p=new char();}
            virtual ~points(){cout<<"destructor points called"<<endl;delete(p);}
  };
  class otherpoints: public points{
                    points x1;
    public: otherpoints(){cout<<"constructor otherpoints called"<<endl;x1=points();}
            ~otherpoints(){cout<<"destructor otherpoints called"<<endl;}
  };
  int main(int argc, char *argv[])
  {
    otherpoints y1;

    return 0;
  }

ここでは、基本クラスのコンストラクターでポインターを割り当て、それぞれの基本クラスのデストラクターでポインターのメモリを破棄します。

valgrind を使用してバイナリを実行すると、エラーが発生します:-

constructor points called

constructor points called

constructor otherpoints called

constructor points called

destructor points called

destructor otherpoints called

destructor points called

==2209== Invalid free() / delete / delete[]

==2209==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)

==2209==    by 0x8048A36: points::~points() (in home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048BB2: otherpoints::~otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x804889A: main (in /home/santosh/programs/c++/parent_child_conscall)

==2209==  Address 0x42d5098 is 0 bytes inside a block of size 1 free'd

==2209==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)

==2209==    by 0x8048A36: points::~points() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048B32: otherpoints::otherpoints() (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    by 0x8048889: main (in /home/santosh/programs/c++/parent_child_conscall)

==2209==    destructor points called

==2209== 

==2209== HEAP SUMMARY:

==2209==     in use at exit: 1 bytes in 1 blocks

==2209==   total heap usage: 3 allocs, 3 frees, 3 bytes allocated

==2209== 

==2209== LEAK SUMMARY:

==2209==    definitely lost: 1 bytes in 1 blocks

==2209==    indirectly lost: 0 bytes in 0 blocks

==2209==      possibly lost: 0 bytes in 0 blocks

==2209==    still reachable: 0 bytes in 0 blocks

==2209==         suppressed: 0 bytes in 0 blocks

==2209== Rerun with --leak-check=full to see details of leaked memory

==2209== 

==2209== For counts of detected and suppressed errors, rerun with: -v

==2209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 18 from 7)

どの 1 バイト メモリの割り当てを解除できないかを知ることができません。

バックトレース レポートを投稿する必要がありますか?

どんな助けでも感謝しています。

4

1 に答える 1

3

ここでの問題は、pointsクラスのインスタンスを 2 つ作成することです。1つは一時的でpoints()、もちろん1つは宣言付きですx1

コンストラクトをx1 = points()使用して一時オブジェクトを作成するとpoints()、これが にコピー割り当てされx1、一時オブジェクトが破棄されます。コピー代入演算子を指定しないため、コンパイラが作成しますが、ポインターをコピーするだけで、新しいメモリは割り当てられません。これは、しばらくの間、同じメモリへのポインタを含む 2 つのオブジェクトがあることを意味します。一時オブジェクトが破棄されると、デストラクタでメモリが解放され、ポインターがx1ぶら下がったままになります。が破棄されたときx1に、このダングリング ポインターを削除しようとすると、ダブルフリー エラーが発生します。

これを解決する最善の方法は、コピー代入演算子、できればコピーコンストラクターも実装し、それらの中で新しいメモリを割り当ててデータをコピーすることです。

于 2013-08-27T12:15:35.923 に答える