因此无法通过删除手动释放堆栈内存,因为这会以某种方式诱导UB。但是在创建派生类对象时,会涉及" new" -keyword。比如说:
void some_function(){
Base* base;
base = new Derived;
}
As" new"涉及,是base = new Derived现在位于堆上?如果是这样,它所在的内存是否需要再次手动释放?或者它是否位于堆栈中,程序终止后内存将被释放?
答案 0 :(得分:4)
规则是:每次使用new
时,都必须使用delete
释放内存。唯一的例外是“展示位置new
“很少使用(见评论)。
在您的情况下,名为base
的指针本身位于堆栈中。但是,它指向的是在堆上分配的。
当程序终止时,内核将释放所有的内存。无论在何处或如何分配内存都无关紧要。
(注意:对于常用的我在这里使用“堆栈”和“堆”,尽管这些术语在C ++标准中没有提到。)
答案 1 :(得分:4)
处理指针时,不要将指针占用的内存与指针指向的内存混淆。
在你的函数中,base
是一个函数局部变量,当它超出范围时它将被清理。但是,内存base
指向的不会。
Before allocation:
--------
| base |
--------
freed at end of scope
After allocation:
-------- ---------------
| base | ===============> | new Derived |
-------- ---------------
freed at end of scope Will not be freed
但是,如果您将delete base;
添加到您的函数中:
-------- ---------------
| base | ===============> | new Derived |
-------- ---------------
freed at end of function freed by "delete base;"