c++ 析构函数 delete
#include <iostream>
using namespace std;
class BASE
{
public:
virtual ~BASE()
{
cout<<"Base deconstruction"<<endl;
}
};
class CCHILD: public BASE
{
public:
~CCHILD()
{
cout<<"CCHILD deconstruction"<<endl;
}
};
int main(int argc, char const *argv[])
{
BASE *Pbase;
BASE b;
Pbase = &b;
delete Pbase;
cout<<"-----"<<endl;
CCHILD c;
Pbase = &c;
delete Pbase;
return 0;
}
请大神解释,delete为什么提示无效的指针啊
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可以简单地认为C++的变量有两类,一类是在程序初始化时已经分配了固定空间的,另一类是由
malloc
动态申请的位于堆空间中的;比如
BASE b
,那么变量b所在位置、所占空间等都是可以确定下来的,属于已经静态分配完成的变量,由编译器安排了其内存地址,是被写死在可执行文件中的;而由
malloc()/new
申请的变量则是动态的,其地址在运行时才被告知,也只有这样的动态分配空间的变量才能被free()/delete
释放空间你的代码想要删除一个被写死在程序中的变量,怎么可能运行成功
老兄,我在你另一个问题里不是回答了么,关于
free()
的http://segmentfault.com/q/1010000002985157
new
/delete
和malloc
/free
是一回事。如果你想使用 delete,一定记得跟 new 配对。
楼上的解释过于粗暴。。。 肿么也不能理解为写死在代码中吧 常量的位置是固定data段的
delete 分两部 调用析构函数 释放堆上内存,而你这种新建变量的方法是在栈上,是不能由你显示的delete的,你想想你删掉了栈上的一块 那么其他栈上资源要不要移动?那一移动offset就都不对了。。。