【发布时间】:2014-10-21 20:41:50
【问题描述】:
下面的程序使用std::unique_ptr<T> 来避免手动内存管理。我尝试了两种方法来实现它。问题在于第二种方法,在分配给原始指针之前,析构函数被调用。这会导致程序崩溃,因为后面的代码会尝试访问无效内存。
我在第二种方法中的意图是,如何在现有代码库中使用智能指针,以便我可以利用智能指针提供的自动内存管理。因此我没有更改声明中的指针类型(即从Widget* w 到std::unique_ptr<Widget> w)。
有人可以详细解释一下吗?最佳实践应该是什么?还是我遗漏了什么?
#include<iostream>
#include<memory>
class Widget {
public:
Widget() { std::cout << "Widget::Widget()" << std::endl; }
virtual ~Widget() { std::cout << "Widget::~Widget()" << std::endl; }
virtual void draw() = 0;
};
class WindowsButton : public Widget {
public:
WindowsButton() = default;
~WindowsButton() = default;
void draw() { std::cout << "WindowsButton"<<std::endl; }
};
int main() {
// Working Code
// std::unique_ptr<Widget> w = std::unique_ptr<Widget>(new WindowsButton());
// w.get()->draw();
//In this way program is crashing while calling the w->draw()
Widget* w = std::unique_ptr<Widget>(new WindowsButton()).get();
w->draw();
}
【问题讨论】:
-
简单地将
w变成std::unique_ptr<Widget>有什么问题? -
@0x499602D2:改原型没问题。但正如我在 SO 中提到的那样,我想在现有代码库中执行此操作。
-
第一种情况下不需要
w.get()->draw();,unique_ptr提供了operator->()重载,所以w->draw();有效。 -
你必须构造一个
std::unique_ptr,然后调用get()
标签: c++ pointers c++11 crash unique-ptr