在函数返回中返回对新分配的shared_ptr的尊重合法吗

Is it legal to return a deference of newly allocated shared_ptr in a function return?

本文关键字:返回 ptr shared 函数 新分配 分配      更新时间:2023-10-16

这段代码可以吗?我知道在函数返回后,引用计数器会降到零,所以应该释放内存。但它能在函数外成功地工作并打印出解引用。

有人能解释一下我想做的是不是错了,为什么?感谢

#include <iostream>
#include <memory>
#include <string>
std::string& get_string(bool en)
{ 
return *std::make_shared<std::string>("hello world");
}
int main () {
auto& my_str = get_string(true);
std::cout << "str=" << my_str <<std::endl;
return 0;
}

输出:

> ./main
str=hello world

一旦您从get_string返回,您的临时共享指针将被销毁,其中的std::string也将被销毁。因此,您使用的是一个悬空引用,它会调用未定义的行为。

在这里详细回答。

由于未定义的行为,程序可能会按预期执行,但它也可以随心所欲。

您所做的是调用未定义的行为。引用曾经引用过的对象已被销毁,不再存在。

因此应该释放内存

是的,内存已经释放。但这并不一定意味着进程将内存返回给操作系统(这通常会使进程无法访问内存(,相反,进程可能仍会保留内存以供重复使用,而"空闲"则只是意味着"可供重复使用"(实际上,这种情况经常发生,因为操作系统通常会将内存分配给大块的进程(。

如果你创建了一个新的字符串对象,那么内存可能会被重新使用,你可能会看到被引用的字符串(已经不存在了!(突然发生不可预测的变化。