发生C ++销毁类错误

时间:2012-05-09 14:07:20

标签: c++ oop class

当我执行时,这个程序有什么问题,我希望类被破坏,但程序结束后我看到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 个答案:

答案 0 :(得分:8)

对未从delete收到的指针调用new是未定义的行为。 IOW,你的代码错了,不要这样做,gil有自动存储,无论如何都会自动销毁(duh)。

答案 1 :(得分:5)

您的代码有未定义的行为。您在未分配delete的指针上调用new 一旦你有一个未定义的行为,所有的赌注都会关闭,任何行为都是可能的。

自动(堆栈)存储上的对象在创建它们的范围{ }结束后将被解除分配,无需为它们调用delete

答案 2 :(得分:1)

您创建的类将被自动销毁,因为它是在堆栈上分配的。您不需要在其上使用delete运算符。但是如果你只想调用析构函数,你可以这样做:

gil.~user();

但我不建议这样做。

答案 3 :(得分: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;
}