1

このプログラムを実行したときの問題は何ですか。クラスを破棄したいのですが、プログラムの最後に cout fetch の後にエラー ボックスが表示されます。何が問題ですか?

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

4 に答える 4

8

deleteから受信されなかったポインタを呼び出すことは、new未定義の動作です。IOW、あなたのコードは間違っています、そうしないでください、gil自動ストレージがあり、とにかく自動的に破壊されます(ええと)。

于 2012-05-09T14:09:46.337 に答える
5

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

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

于 2012-05-09T14:09:55.183 に答える
1

作成したクラスは、スタックに割り当てられるため、自動的に破棄されます。削除演算子を使用する必要はありません。ただし、デストラクタ関数を呼び出したいだけの場合は、次のように実行できます。

gil.~user();

ただし、それはお勧めしません。

于 2012-05-09T14:13:47.347 に答える
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;
}
于 2012-05-09T14:14:26.390 に答える