2012-05-09 3 views
1

実行時にこのプログラムの問題は何ですか、クラスを破棄したいのですが、プログラムの最後には、coutフェッチ後にエラーボックスが表示されます。 問題は何ですか? newから受信されなかったポインタにdeleteを呼び出すC++破壊クラスエラーが発生しました

#include <iostream> 
using namespace std; 

class user { 

    public:int internal; 
    public:user(int point) { 
       internal = point; 
      }; 

      ~user() { 
       cout << "Fetch"; 
      } 
    }; 



void main() { 
    user gil(5); 
    user * p; 
    p=&gil; 
    delete p; 
    getchar(); 
} 
+0

http://www2.research.att.com/~ bs/bs_faq2.html#void-main – chris

+2

一般規則:各 'new'に対して、ちょうど1つの' delete'。それぞれの 'new []'に対してちょうど一つの 'delete []'があります。あなたは 'new'よりも' delete'を多く持っています。 –

答えて

1

試してみてください。

#include <iostream> 
using namespace std; 

class user 
{ 
public: 
    int internal; 
    user(int point) 
    { 
    internal = point; 
    } 

    ~user() 
    { 
    cout << "Fetch" << endl; 
    } 
}; 

int main() 
{ 
    user* p = new user(5); 
    cout << p->internal << endl; 
    delete p; 
    return 0; 
} 

new/deleteを使用しないようにし、それがスコープ外になった場合、変数が破壊ました:

#include <iostream> 
using namespace std; 

class user 
{ 
public: 
    int internal; 
    user(int point) 
    { 
    internal = point; 
    } 

    ~user() 
    { 
    cout << "Fetch" << endl; 
    } 
}; 

int main() 
{ 
    user p(5); 
    cout << p.internal << endl; 
    return 0; 
} 
+0

@Billは、この問題の原因について非常に良い洞察を提供するので、他の答えやコメントに耳を傾けます。あなたがプログラミングをしているときにそれらを念頭に置いておくと、多くの頭痛を軽減します。 – Drise

+4

自動変数を使うのではなく、 'new' /' delete'を推奨するために-1を試しています。 –

+0

@ JohnDibling私はあなたが心配していた代替方法を追加しました。 – Drise

8

は未定義の動作です。 IOW、あなたのコードは間違っていますが、それをしないでください。gilには自動ストレージがあり、とにかく自動的に破壊されます。

5

コードにがあります。未定義の動作newで割り当てられていないポインタでdeleteを呼び出しています。
未定義の動作をすると、すべての賭けはオフになり、動作は可能です。

自動(スタック)ストレージのオブジェクトは、作成されたスコープ{}が終了すると割り当て解除されます。deleteを呼び出す必要はありません。

1

作成したクラスはスタックに割り当てられているため、自動的に破壊されます。削除演算子を使用する必要はありません。しかし、デストラクタ関数を呼び出すだけなら、それを行うことができます:

gil.~user(); 

しかし、私はそれをお勧めしません。

+0

良い選択私はそれをしたかった –

+0

@ビルゲイツ:いいえ、そうではありません。あなたはそうすると思うかもしれませんが、そうではありません。 –

関連する問題