c ++无法理解使用智能指针的基本概念

时间:2015-03-05 23:24:40

标签: c++ smart-pointers

我回到了c ++,无法理解为什么这会给我一个错误:

#include <memory>

int main(int argc, char** argv)
{
    std::string str = "hello";
    std::shared_ptr<std::string> pStr(&str);

    return 0;
}

刚刚运行这个给我一个错误:表达式:BLOCK_TYPE _... 为什么呢?

2 个答案:

答案 0 :(得分:8)

智能指针应该管理它所持有的指针所指向的对象的生命周期。但在这种情况下,您向它传递了一个指向管理自身的对象的指针。在范围的最后,智能指针的析构函数尝试删除一个“删除”自身的对象。

答案 1 :(得分:5)

该行

std::string str = "hello";

在堆栈上创建一个局部变量。当该变量超出块结尾的范围时,将自动调用此变量的析构函数。您不应该尝试删除堆栈上的对象。这是智能指针在超出范围时将尝试执行的操作。

如果在堆上创建字符串,即

std::string* str = new std::string("hello");
std::shared_ptr<std::string> pStr(str);

然后智能指针在超出范围时将正确地进行清理。