免责声明:我知道这不是应该如何使用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);
....
}