使用堆栈指针删除派生类?

时间:2015-03-31 23:00:32

标签: c++ memory derived-class

因此无法通过删除手动释放堆栈内存,因为这会以某种方式诱导UB。但是在创建派生类对象时,会涉及" new" -keyword。比如说:

void some_function(){
    Base* base;
    base = new Derived;
}

As" new"涉及,是base = new Derived现在位于堆上?如果是这样,它所在的内存是否需要再次手动释放?或者它是否位于堆栈中,程序终止后内存将被释放?

2 个答案:

答案 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;"