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有自动存储,无论如何都会自动销毁(duh)。

于 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 回答