在函数返回中返回对新分配的shared_ptr的尊重合法吗
Is it legal to return a deference of newly allocated shared_ptr in a function return?
这段代码可以吗?我知道在函数返回后,引用计数器会降到零,所以应该释放内存。但它能在函数外成功地工作并打印出解引用。
有人能解释一下我想做的是不是错了,为什么?感谢
#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
也将被销毁。因此,您使用的是一个悬空引用,它会调用未定义的行为。
在这里详细回答。
由于未定义的行为,程序可能会按预期执行,但它也可以随心所欲。
您所做的是调用未定义的行为。引用曾经引用过的对象已被销毁,不再存在。
因此应该释放内存
是的,内存已经释放。但这并不一定意味着进程将内存返回给操作系统(这通常会使进程无法访问内存(,相反,进程可能仍会保留内存以供重复使用,而"空闲"则只是意味着"可供重复使用"(实际上,这种情况经常发生,因为操作系统通常会将内存分配给大块的进程(。
如果你创建了一个新的字符串对象,那么内存可能会被重新使用,你可能会看到被引用的字符串(已经不存在了!(突然发生不可预测的变化。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 接口 PTR 的返回向量C++
- 正确地返回一个唯一的ptr
- 删除从函数返回的唯一ptr
- 将ptr返回到堆栈缓冲区
- 提升文件系统错误(temp_directory_path返回<错误 Ptr>)