为什么这个智能指针在其目标应该被删除时给出正确的结果?

0 c++ smart-pointers undefined-behavior

免责声明:我知道不应该使用unique_ptr,但为了便于理解,我想知道这里发生了什么.谢谢!

考虑这个功能:

void foo(int* a) {
    unique_ptr<int> pointer_in_function(a);
}
Run Code Online (Sandbox Code Playgroud)

而这个主要功能:

int main(void) {
    int* myInt = new int(5);
    unique_ptr<int> pointer_in_main(myInt);

    foo(myInt);

    cout << *pointer_in_main << endl;
    cout << *pointer_in_main << endl;

    cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我一直从第一个cout得到正确的答案.第二个是未定义的.该程序有时会在退出时出现严重错误而崩溃,但并非总是如此.

我不明白为什么第一个cout一致地给出了正确的答案.当pointer_in_function超出范围时,myInt指向的整数是否应该被删除?谢谢您的帮助!

编辑:顺便说一句,为了确保,我在假设调用foo应该删除我的整数是正确的,因为pointer_in_function超出了范围?

小智 5

我不明白为什么第一个cout一致地给出了正确的答案.

大多数实现在删除或将其返回到操作系统后都不会清除内存,因此如果在删除后快速检查内存,则其未被覆盖的可能性会更高.

这是未定义行为的有效后果之一.它可能是100%可预测特定实现,但它不需要在其他实现上表现相同.