如何在C ++

时间:2017-04-19 19:12:55

标签: c++ raii

ref中,他们有这行代码

Widget *aWidget = new BorderDecorator(new BorderDecorator(new ScrollDecorator
(new TextField(80, 24))));

两个问题:

  

说,我想明确删除用new创建的对象。怎么做   你这样做?

     

BTW,如果我只是添加

delete aWidget; 
     

我收到警告:删除抽象类类型的对象' Widget'   具有非虚拟析构函数将导致未定义的行为   [-Wdelete-非虚拟析构函数]

第二个相关问题:

  

如何使用unique_ptr

编写此嵌套新闻

由于

2 个答案:

答案 0 :(得分:3)

您所关注的示例掩盖了所有内存管理。这可能会导致坏习惯。

要正确管理内存,您可以简单地避免动态分配:

TextField textField(80, 24);
ScrollDecorator scrollDecorator(&textField);
BorderDecorator bd1(&scrollDecorator);
BorderDecorator bd2(&bd1);
Widget *aWidget = &bd2;

没有new是个好消息!

Widget确实应该有一个虚拟析构函数。

答案 1 :(得分:1)

您的问题并不是要删除该对象,您的问题是您正在删除一个没有virtual析构函数的潜在多态对象,留下了最有派生的阶级无法得到适当清理的可能性。

See here for more information.