我回到了c ++,无法理解为什么这会给我一个错误:
#include <memory>
int main(int argc, char** argv)
{
std::string str = "hello";
std::shared_ptr<std::string> pStr(&str);
return 0;
}
刚刚运行这个给我一个错误:表达式:BLOCK_TYPE _... 为什么呢?
答案 0 :(得分:8)
智能指针应该管理它所持有的指针所指向的对象的生命周期。但在这种情况下,您向它传递了一个指向管理自身的对象的指针。在范围的最后,智能指针的析构函数尝试删除一个“删除”自身的对象。
答案 1 :(得分:5)
该行
std::string str = "hello";
在堆栈上创建一个局部变量。当该变量超出块结尾的范围时,将自动调用此变量的析构函数。您不应该尝试删除堆栈上的对象。这是智能指针在超出范围时将尝试执行的操作。
如果在堆上创建字符串,即
std::string* str = new std::string("hello");
std::shared_ptr<std::string> pStr(str);
然后智能指针在超出范围时将正确地进行清理。