C++ shared_ptr 和内置指针

标签 c++ pointers shared-ptr

删除两次内置指针导致undefined,请问这种情况是怎么回事呢? 在此代码中,是否未定义共享指针?

string *str_1 = new string;
std::shared_ptr<string> str_ptr(str_1);

*str_1 = "C++";
cout << *str_ptr << endl;
*str_ptr = "C#";
cout << *str_1 << endl;

// str_1 & str_ptr refers same piece of memory    
delete str_1;

cout << *str_ptr << endl;  // Is this undefined?

最佳答案

您的代码是未定义的,因为在调用删除原始指针之后,shared_ptr 留下了悬空指针引用。然后您继续取消引用已释放的内存(未定义的行为 1)。当 shared_ptr 超出范围时,它将在它被告知要管理的指针上调用 delete,这会释放已经释放的内存(未定义的行为 2)。

为方便起见,shared_ptr 允许从原始指针进行初始化,但您应该允许它在之后管理分配的内存。当您将原始指针提供给 shared_ptr 时,管理原始指针(例如,删除它或初始化另一个 shared_ptr)是错误的。

实际上更好的做法是,在使用 shared_ptr 时使用辅助函数 make_shared

std::shared_ptr<std::string> sp = std::make_shared<std::string>("C++");

这种格式避免了您必须处理创建原始指针的问题。它也被证明更有效率,因为它避免了智能指针在传递原始指针时必须做的额外分配。

关于C++ shared_ptr 和内置指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143434/

相关文章:

c++ - 如何使依赖于模板的 typedef 更方便?

c++ - 使用逻辑或 ||合并两个整数?

C# 指针引用

c++ - 比较运算符中的共享指针常量 ==

C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?

c++ - macOS Time Profiler 分析 C++ 代码但找不到我的函数名称

c++ - 关闭qt应用程序时,想杀死qprocess

Python:更新引用值

pointers - 如何将不同的错误接口(interface)实现存储在一起,然后在 Go 中使用它们进行类型比较?

c++ - shared_ptr 的 random_shuffle vector 不好(甚至危险)吗?