gpt4 book ai didi

c++ - std::unique_ptr 超出范围后对象仍然可访问。不同的运行时行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:30 25 4
gpt4 key购买 nike

以下代码向函数 modify_entry 传递了一个指向 Entry 类型对象的指针,并且在函数体内 unique_ptr 采用原始指针。但是,指针指向的对象似乎在函数返回后继续存在。

当我编译这段代码时

#include <iostream>
#include <memory>

struct Entry {

Entry(std::string name) : name_(name) { std::cout << "Constructor for " + name_ + '\n'; }
~Entry() { std::cout << "Destructor for " + name_ + '\n'; }
std::string name_;

};

void modify_entry(Entry* e_ptr){

std::cout << "Inside modify_entry()\n";
std::unique_ptr<Entry>{e_ptr}->name_ += " Doe";

}

int main(int argc, const char * argv[])
{

Entry* entry_ptr = new Entry("John");
modify_entry(entry_ptr);
std::cout << "Back from modify_entry()\n";
std::cout << entry_ptr->name_ << '\n'; // <---- line 25

return 0;

}

clang version 3.4 (tags/RELEASE_34/final)

Target: x86_64-apple-darwin13.1.0

Thread model: posix

它运行没有错误,输出是

Constructor for John

Inside modify_entry()

Destructor for John Doe

Back from modify_entry()

John Doe

Here ,但是,由于第 25 行,我收到运行时错误。

问:为什么运行clang生成的可执行文件没有运行时错误?

如果有人能澄清一下情况,我将不胜感激。请注意,我并不是要正确转让所有权。这个人为设计的错误代码示例是调试过程的副产品。 make_uniqueunique_ptr 等的移动语义很棒,但这不是我要问的。

提前致谢。

最佳答案

However, the object to which the pointers point seems to live on after the function returns.

这里的关键是“似乎”。实际上,Entry 的生命周期在这一行的末尾结束:

 std::unique_ptr<Entry>{e_ptr}->name_ += " Doe";

unique_ptr 获得了内存的所有权,但是临时 unique_ptr 的生命周期在该语句结束时结束,因此它也删除了 Entry 它拥有。访问对象以前使用的内存是未定义的行为。它适用于某些平台而不适用于其他平台,这只是未定义行为的本质。

关于c++ - std::unique_ptr 超出范围后对象仍然可访问。不同的运行时行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23086400/

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