当应该删除其目标时,为什么此智能指针给出正确的结果



免责声明:我知道这不是应该如何使用unique_ptr,而是为了理解,我想知道这里发生了什么。谢谢!

考虑此功能:

void foo(int* a) {
    unique_ptr<int> pointer_in_function(a);
}

和此主要功能:

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;
}

我始终从第一个代表中得到正确的答案。第二个是不确定的。程序有时在退出时发生严重错误崩溃,但并非总是如此。

我不明白的是为什么第一个cout会始终如一地给出正确的答案。当pointer_in_function脱离范围时,Myint指向的整数是否不应该被删除吗?谢谢您的帮助!

编辑:顺便确定,我是否可以在我的假设中正确地删除我的整数,因为pointer_in_function脱离了范围?

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

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

这是不确定行为的有效后果之一。在您的您的特定实施中,它可能100%可预测,尽管它不需要在其他方面行事相同。

这不是使用构造函数/破坏者或删除的(纯(实验的好方法。如果您的对象未腐烂,则并不意味着尚未调用delete运算符(因为它对内存数据的效果不确定,并且实际上许多内存管理器实现并没有立即更改发布的内存内容(。取而代之的是,使用显式构造函数创建一个类,并报告其调用,并将其代替int。由于destructor呼叫预先删除对象删除(并且由于您的代码不使用正在测试的对象的堆栈或静态分配,因此destructor调用始终意味着删除(,您可以使用destructor呼叫来跟踪删除。类似:

#include <iostream>
class MyObj {
    int value;
    MyObj(int v) : value(v) {std::cerr << "MyObj ctor called"<<std::endl;}
    ~MyObj() {std::cerr << "MyObj dtor called"<<std::endl;}
};
.....
int main (int argc, char **argv) {
    MyObj* myInt = new MyObj(5);
....
}

相关内容

  • 没有找到相关文章

最新更新