一般需要析构函数的类里面包含有指针,所以因为动态创建的指针只能够delete一次,那么用new创建该类的一个对象后,delete两次出错是必然的;但是如果为一个不包含指针的类添加一个不做任何事情的析构函数,为何在new之后delete两次也会出错呢?参见下面代码,编译是没问题的,但是运行时出错:
#include "cstdio" class CTest { public: CTest( ) = default; ~CTest( ) { printf("\nThe destructor of CTest has been called.\n"); } }; int main(void) { CTest* pTest = new CTest( ); delete pTest; delete pTest; return 0; }
解决方案:5分
Linux的new和delete是开源的。
解决方案:5分
CTest* pTest = new CTest( );//申请内存
delete pTest;//释放内存,并且把内存归还给操作系统(实际上是CRT库)
delete pTest;//删除野指针,野指针指向的内存可能是空闲状态也可能是再次被分配了(可参考CRT库的内存管理机制)
delete pTest;//释放内存,并且把内存归还给操作系统(实际上是CRT库)
delete pTest;//删除野指针,野指针指向的内存可能是空闲状态也可能是再次被分配了(可参考CRT库的内存管理机制)
解决方案:5分
除了析构函数之外,new和delete还为对像本身分配内存和回收本身的内存给系统。
CTest* pTest 这个本来就指向一块内存,delete它二次,就是回收它二次,它怎么能被回收两次呢?
这和析构函数没关系的。
CTest* pTest 这个本来就指向一块内存,delete它二次,就是回收它二次,它怎么能被回收两次呢?
这和析构函数没关系的。
解决方案:5分
delete2次出错不是正常的吗,至少我从来没有疑惑过。
因此,一般为了避免这种情况,
delete后,把指针赋值为nulll
因此,一般为了避免这种情况,
delete后,把指针赋值为nulll
解决方案:5分
delete pTest; 这句话会先对对象进行析构,然后释放对象所占用的内存空间
两次释放对象占用的内存空间肯定出错了
出错不在于对象的析构,而是他自身的内存空间
两次释放对象占用的内存空间肯定出错了
出错不在于对象的析构,而是他自身的内存空间
解决方案:5分
一般人可能就想new和delete配套,不能不delete,也不能两次delete。
解决方案:2分
类都有一个指向自己的this指针,这样就没有不包含指针的类了。
解决方案:6分
delete 做了这么几件事
1)调用析构函数
2)回收内存,使之可以再次分配
内存管理,通常是某种方式,记录一下某块内存已经分配了(大小是多少),
某块内存是自由内存(大小是多少),尚未分配
new 会 记录这块内存已经分配,以及分配的大小
delete 会记录为未分配,并且可能会合并小块内存
两次 delete 即便连续的,也可能会出错,
因为同一内存地址 的内存相关的纪录,已经不是 new 分配时候,做的了。
也可能根本就没有了这块记录(被合并了),
由于采用的分配回收算法不同,可能会出现不同的问题。
假设,内存分配记录在就在内存前面,而delete 会改掉这个记录
1)调用析构函数
2)回收内存,使之可以再次分配
内存管理,通常是某种方式,记录一下某块内存已经分配了(大小是多少),
某块内存是自由内存(大小是多少),尚未分配
new 会 记录这块内存已经分配,以及分配的大小
delete 会记录为未分配,并且可能会合并小块内存
两次 delete 即便连续的,也可能会出错,
因为同一内存地址 的内存相关的纪录,已经不是 new 分配时候,做的了。
也可能根本就没有了这块记录(被合并了),
由于采用的分配回收算法不同,可能会出现不同的问题。
假设,内存分配记录在就在内存前面,而delete 会改掉这个记录