2017-03-09 4 views
-2

セグメンテーションエラーを期待したが、二重の自由や破損(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(); 
} 

私は浅いコピーを理解しようとしている、としていますセグメント化エラーが予想されます。何が、割り当てられたメモリへの有効なポインタまたはnullptrdelete(またはdelete[])に引き渡し

+0

コピーコンストラクタでは、ソースオブジェクトからターゲットオブジェクトにelemを割り当てます。テストf()のスコープが終了すると、elemがtのelemを指すelemのdelete []を呼び出します。次に、mainがスコープから外れると、elemでdelete []が呼び出されますが、fがスコープから外れると、これはすでに解放されています。 – user3336523

+0

メモリを削除する前にエラーがスローされている必要があります。終了時にtが表示された場合 – unixlover

+0

これは、以下の答えに記載されているように保証されていません。メモリを削除しても、t内のelemポインタをNULLに変更することはありません。そのポインタはヒープ内の同じ場所を指し示していますが、そのメモリは割り当てられなくてもアクセスできます。 – user3336523

答えて

5

未定義の動作につながります。それはfの破壊にdelete[]に渡された後、あなたがtオブジェクトにポインタを使用するので

はまた、あなたはあなたの最後のdisplay呼び出しで既に存在未定義の動作を持っています。

UB(Undefined Behavior)が実際には無関係なときはどうなりますか。時には(メモリが削除された後displayへの呼び出しのように)うまく動作すると思われることがあります。セグメンテーションフォルトが発生することがあります。ダブルエラーのようなエラーが発生することがあります。nasal demons。定義されていない動作は、その定義によって、は未定義ですです。

+4

メモリ保護をしていないシステムから来て、人々がセグメンテーションを "期待"するとき、それは私に忍び寄ってくれます... – DevSolar