【提问】关于new和delete
new返回的是一个指针然后delete也是接收一个指针,如果这样Test t = *(new Test());
delete &t;
会崩溃,求解 Test t = *(new Test());
执行的是拷贝构造函数。按照楼主的思想。
Test *pt = new Test();
Test t = *pt;
delete &t;
这样合理吗?
首先要清楚new和delete是分别做什么的:
new是用来动态创建一个对象,而delete是用来删除一个动态对象。必须要注意new和delete是对应的,一个用来创建,一个用来删除。
而你遇到的问题是什么呢。解析如下:
Test t = *(new Test());
这句话你首先是new了一个Test对象,然后用*号获取对象指针中的实际对象内容,然后再将其拷贝给t。
其中很关键的一点是,*(new Test())赋值给t调用的是构造函数进行内容拷贝。也就是说,t和new Test()是两个独立的对象。
而t是一个局部变量,也就是说t的数据是在栈中保存着。而new Test()是动态创建的,数据是在堆中保存着的。
那么接下来的delete &t;是程序崩溃的最终语句。
因为t是一个局部变量,并不是由new创建的。delete删除t就会直接导致内存崩溃。
所以,下面是以后编程必须要特别留意的:
1.局部变量t不是一个指针,而是一个真实存在于栈空间中的对象,是无法用delete进行删除的!
2.delete只能用于删除new创建的对象。包括类似的c语言中的malloc和free也是同理,他们都是一一对应的方法。不可交叉乱用。
感谢感谢,讲的很浅显易懂 谢谢,懂了
页:
[1]