这段代码理论上都会有double free,但是为什么没有重复
This code are theoretically there will be a double free, but why no repetition
new Widget由两个smart Pointer manager,所以会出现double free的问题,但是执行后不会出现
std::vector<std::shared_ptr<Widget>> processedWidget;
class Widget {
public:
void process();
};
void Widget::process() {
processedWidget.emplace_back(this);
}
int main() {
{
std::shared_ptr<Widget> w(new Widget);
w->process();
}
return 0;
}
双重删除是标准未定义的行为。所以它可能会出现起作用,同时隐藏着灾难。像这样的代码的正确方法是使用 std::enable_shared_from_this
std::vector<std::shared_ptr<Widget>> processedWidget;
class Widget : private std::enable_shared_from_this<Widget> {
public:
void process();
};
void Widget::process() {
processedWidget.emplace_back(shared_from_this());
}
int main() {
{
std::shared_ptr<Widget> w(new Widget);
w->process();
}
return 0;
}
new Widget由两个smart Pointer manager,所以会出现double free的问题,但是执行后不会出现
std::vector<std::shared_ptr<Widget>> processedWidget;
class Widget {
public:
void process();
};
void Widget::process() {
processedWidget.emplace_back(this);
}
int main() {
{
std::shared_ptr<Widget> w(new Widget);
w->process();
}
return 0;
}
双重删除是标准未定义的行为。所以它可能会出现起作用,同时隐藏着灾难。像这样的代码的正确方法是使用 std::enable_shared_from_this
std::vector<std::shared_ptr<Widget>> processedWidget;
class Widget : private std::enable_shared_from_this<Widget> {
public:
void process();
};
void Widget::process() {
processedWidget.emplace_back(shared_from_this());
}
int main() {
{
std::shared_ptr<Widget> w(new Widget);
w->process();
}
return 0;
}