当然,下一个不应该完成,尽管它对编译器有效。但是当你这么做时会发生什么?
CClass clss = *new CClass();
与上面相反,接下来会编译但会产生断言错误。
delete &clss;
这是否与在堆栈或堆上分配内存有关?
答案 0 :(得分:2)
如果你将其分解:
new CClass()
- >动态分配的实例指针
CClass clss
- >静态分配的变量
CClass clss = *new CClass();
- >将临时指向的值复制到clss
&clss
- >静态分配变量的地址
delete &clss;
- >删除静态分配的变量(没有意义)
答案 1 :(得分:1)
第一行代码是正确的,您使用动态分配的另一个实例初始化静态分配的CClass
实例。
当您尝试删除尚未动态分配的对象时,第二个显然是错误的。
第一行产生内存泄漏,因为您动态分配了一堆内存但从未保留其地址,因此永远不会释放(删除)。