gpt4 book ai didi

C++ shared_ptr 和内置指针

转载 作者:行者123 更新时间:2023-11-30 01:17:09 25 4
gpt4 key购买 nike

删除两次内置指针导致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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com