下面的代码将modify_entry
一个指向类型对象的指针传递给函数,Entry
并且在函数体内 aunique_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 3.4 版 (tags/RELEASE_34/final)
目标:x86_64-apple-darwin13.1.0
线程模型:posix
它运行没有错误,输出是
约翰的构造函数
在 modify_entry() 内部
John Doe 的析构函数
从 modify_entry() 返回
约翰·多伊
但是,在这里,由于第 25 行,我收到了运行时错误。
Q:为什么运行clang生成的可执行文件没有运行时错误?
如果有人能澄清情况,我将不胜感激。请注意,我并没有尝试正确转让所有权。这个人为设计的错误代码示例是调试过程的副产品。make_unique
并为等移动语义unique_ptr
很棒,但这不是我要问的。
提前致谢。