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