セグメンテーションエラーを期待したが、二重の自由や破損(fasttop)を取得:0x0000000000cf4c20 ***ダブルエラーフリーの代わりに、セグメンテーションエラー
PFBコード
#include<iostream>
using namespace std;
class test
{
public:
int size;
int *elem;
test(int x):size(x),elem(new int[x])
{
cout<<"default constructor"<<endl;
}
test(const test & x)
{
cout<<"copy constructor and shallow copying";
this->size=x.size;
this->elem=x.elem;
}
~test()
{
delete [] elem;
}
void display()
{
for (int i=0;i<size;i++)
{
cout<<*(elem+i)<<endl;
}
}
};
int main()
{
test t(3);
t.elem[0]=12;
t.elem[1]=24;
t.elem[2]=33;
{
test f(t);
f.display();
t.display();
}
t.display();
}
私は浅いコピーを理解しようとしている、としていますセグメント化エラーが予想されます。何が、割り当てられたメモリへの有効なポインタまたはnullptr
delete
(またはdelete[]
)に引き渡し
コピーコンストラクタでは、ソースオブジェクトからターゲットオブジェクトにelemを割り当てます。テストf()のスコープが終了すると、elemがtのelemを指すelemのdelete []を呼び出します。次に、mainがスコープから外れると、elemでdelete []が呼び出されますが、fがスコープから外れると、これはすでに解放されています。 – user3336523
メモリを削除する前にエラーがスローされている必要があります。終了時にtが表示された場合 – unixlover
これは、以下の答えに記載されているように保証されていません。メモリを削除しても、t内のelemポインタをNULLに変更することはありません。そのポインタはヒープ内の同じ場所を指し示していますが、そのメモリは割り当てられなくてもアクセスできます。 – user3336523