在ref中,他们有这行代码
Widget *aWidget = new BorderDecorator(new BorderDecorator(new ScrollDecorator
(new TextField(80, 24))));
两个问题:
说,我想明确删除用new创建的对象。怎么做 你这样做?
BTW,如果我只是添加
delete aWidget;
我收到警告:删除抽象类类型的对象' Widget' 具有非虚拟析构函数将导致未定义的行为 [-Wdelete-非虚拟析构函数]
第二个相关问题:
如何使用unique_ptr
编写此嵌套新闻
由于
答案 0 :(得分:3)
您所关注的示例掩盖了所有内存管理。这可能会导致坏习惯。
要正确管理内存,您可以简单地避免动态分配:
TextField textField(80, 24);
ScrollDecorator scrollDecorator(&textField);
BorderDecorator bd1(&scrollDecorator);
BorderDecorator bd2(&bd1);
Widget *aWidget = &bd2;
没有new
是个好消息!
而Widget
确实应该有一个虚拟析构函数。
答案 1 :(得分:1)
您的问题并不是要删除该对象,您的问题是您正在删除一个没有virtual
析构函数的潜在多态对象,留下了最有派生的阶级无法得到适当清理的可能性。