为什么new 创建的对象不能delete两次,即使类并不含指针?

C++语言 码拜 7年前 (2015-11-02) 1185次浏览
一般需要析构函数的类里面包含有指针,所以因为动态创建的指针只能够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库的内存管理机制)
解决方案:5分
除了析构函数之外,new和delete还为对像本身分配内存和回收本身的内存给系统。
 CTest* pTest 这个本来就指向一块内存,delete它二次,就是回收它二次,它怎么能被回收两次呢?
这和析构函数没关系的。
解决方案:5分
delete2次出错不是正常的吗,至少我从来没有疑惑过。
因此,一般为了避免这种情况,
delete后,把指针赋值为nulll
解决方案:5分
delete pTest; 这句话会先对对象进行析构,然后释放对象所占用的内存空间
两次释放对象占用的内存空间肯定出错了
出错不在于对象的析构,而是他自身的内存空间
解决方案:5分
一般人可能就想new和delete配套,不能不delete,也不能两次delete。
解决方案:2分
类都有一个指向自己的this指针,这样就没有不包含指针的类了。
解决方案:6分
delete 做了这么几件事
1)调用析构函数
2)回收内存,使之可以再次分配
内存管理,通常是某种方式,记录一下某块内存已经分配了(大小是多少),
某块内存是自由内存(大小是多少),尚未分配
new 会 记录这块内存已经分配,以及分配的大小
delete 会记录为未分配,并且可能会合并小块内存
两次 delete 即便连续的,也可能会出错,
因为同一内存地址 的内存相关的纪录,已经不是 new 分配时候,做的了。
也可能根本就没有了这块记录(被合并了),
由于采用的分配回收算法不同,可能会出现不同的问题。
假设,内存分配记录在就在内存前面,而delete 会改掉这个记录

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么new 创建的对象不能delete两次,即使类并不含指针?
喜欢 (0)
[1034331897@qq.com]
分享 (0)