所以堆栈内存不能通过删除手动释放,因为这不知何故会导致UB。但是在创建派生类对象时,涉及到“new”关键字。比如说:
void some_function(){
Base* base;
base = new Derived;
}
由于涉及“new”,base = new Derived 现在是否位于堆上?如果是这样,它所在的内存是否需要再次手动释放?或者它位于堆栈中,并且在程序终止后内存将被释放?
最佳答案
规则是:任何时候使用new
,都必须使用delete
释放内存。唯一的异常(exception)是名为“放置 new
”,很少使用(见评论)。
在您的例子中,名为base
的指针 本身位于堆栈中。但是,它指向的是在堆上分配的。
当您的程序终止时,内核将释放所有 的内存。内存在何处或如何分配并不重要。
(学究们请注意:我在这里根据常用用法使用“堆栈”和“堆”,尽管事实上 C++ 标准中并未提及这些术语。)
关于c++ - 使用堆栈指针删除派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29380023/