如何删除在cpp中的main中创建的对象
how to delete objects created in main in cpp
当我 运行 我得到代码时 "b fn
破坏b
destruct a" 和 运行time 错误。问题是删除任何一个对象说 b 的对象调用 class a 的析构函数,所以当另一个 delete 尝试删除它命中的对象时 运行时间错误,所以有人好心建议,我们该如何解决这个问题?
#include <iostream>
using namespace std;
class a
{
public:
virtual void f(){cout<<"a fn"<<endl;};
virtual ~a(){cout<<"destruct a"<<endl;};
};
class b: public a
{
public:
void f(){cout<<"b fn"<<endl;};
~b(){cout<<"destruct b"<<endl;};
};
int main() {
class a *aa = new a;
class b *bb = new b;
aa = bb;
aa->f();
delete aa;
delete bb;
return 0;
}
您的程序行为未定义。
设置aa = bb;
是灾难性的:
您将尝试删除同一个对象两次。这是未定义的行为。
你永远不会 delete
原来的 aa
。那是内存泄漏。
删除那行,一切都会好起来的。如果你想测试多态性,那么你可以写
class/*actually, not required*/ a *bb = new b;
有
class a *aa = new a;
class b *bb = new b;
aa = bb;
您不再参考 new a
所以
delete aa; // delete 'new b'
delete bb; // delete 'new b' a second time
两次删除同一个指针
删除这个
aa = bb;
你会得到输出
a fn
destruct a
destruct b
destruct a
成功
当我 运行 我得到代码时 "b fn 破坏b destruct a" 和 运行time 错误。问题是删除任何一个对象说 b 的对象调用 class a 的析构函数,所以当另一个 delete 尝试删除它命中的对象时 运行时间错误,所以有人好心建议,我们该如何解决这个问题?
#include <iostream>
using namespace std;
class a
{
public:
virtual void f(){cout<<"a fn"<<endl;};
virtual ~a(){cout<<"destruct a"<<endl;};
};
class b: public a
{
public:
void f(){cout<<"b fn"<<endl;};
~b(){cout<<"destruct b"<<endl;};
};
int main() {
class a *aa = new a;
class b *bb = new b;
aa = bb;
aa->f();
delete aa;
delete bb;
return 0;
}
您的程序行为未定义。
设置aa = bb;
是灾难性的:
您将尝试删除同一个对象两次。这是未定义的行为。
你永远不会
delete
原来的aa
。那是内存泄漏。
删除那行,一切都会好起来的。如果你想测试多态性,那么你可以写
class/*actually, not required*/ a *bb = new b;
有
class a *aa = new a;
class b *bb = new b;
aa = bb;
您不再参考 new a
所以
delete aa; // delete 'new b'
delete bb; // delete 'new b' a second time
两次删除同一个指针
删除这个
aa = bb;
你会得到输出
a fn
destruct a
destruct b
destruct a
成功