我运行了这个程序,但我没有得到这个 auto_ptr 的作用以及它在哪些基础上显示值?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
我运行了这个程序,但我没有得到这个 auto_ptr 的作用以及它在哪些基础上显示值?
int main(int argc,char **argv)
{
int *i= new int;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count <<x.get()<<endl;
count <<y.get()<<endl;
}
此代码将为第一个 auto_ptr 对象打印一个 NULL 地址,为第二个对象打印一些非 NULL 地址,表明源对象在分配期间丢失了引用 (=)。
auto_ptr 假定对您构造它的指针的所有权。
IE。一旦 auto_ptr 本身被销毁,它将自动销毁指向的对象。
auto_ptr<int> x(i)
会让x拥有我
auto_ptr<int> y
会让你不拥有任何东西
您的y=x
操作会将 i* 的所有权从 x 转移到 y
所以现在 y 拥有 i 而 x 什么都没有,这意味着当 x 被销毁时,什么都不会发生,而当 y 被销毁时,我会被删除
对于这个程序,auto_ptr
就像一个普通的指针,除了:
delete
当它超出范围时,它是任何仍然指向的对象因此,x
最初取 的值i
。然后y=x
有效地要求x
忘记i
(通过存储 NULL 哨兵值),并y
记住i
. 然后打印 get 返回的指针值将显示 NULL/0x
和非 NULL 值(匹配i
)y
。然后 asmain()
返回,y
离开x
作用域,并且 asy
持有非 NULL 指针值匹配i
,它将delete
int 对象,释放堆内存。
auto_ptr
自动释放在new
其作用域结束时分配的内存(在这种情况下,当 main 退出时)。然而,这个例子相当愚蠢,因为整数从不接收实际值,所以我不得不想象你看到的是垃圾。
这可能更能说明问题:
int main(int argc,char **argv)
{
int *i= new int;
*i = 5;
auto_ptr<int> x(i);
auto_ptr<int>y;
y=x;
count << *(x.get()) <<endl;
count << *(y.get()) <<endl;
*x.get() = 7;
count << *(x.get()) <<endl;
count << *(y.get()) <<endl;
}
简而言之,auto_ptr
它是一个模板化对象,当其变量超出范围时,将调用其析构函数并释放其获取的内存。它是智能指针的更简单版本之一。
auto_ptr
接管对象的所有权。需要注意的重要一点是
unique_ptr
由于这些原因,它倾向于与 RAII(资源获取即初始化)范例结合使用。例如,假设您分配了一个变量而不将其存储在 auto_ptr 中,那么您必须自己管理内存的删除。下面的示例显示这必须执行两次,一次用于良好路径,一次用于失败路径。
A* p(new A);
try {
....
}
catch (std::exception& e) {
delete p;
return;
}
delete p;
如果我们使用 auto_ptr 代替它,我们不必记住删除分配的内存。
auto_ptr<A> p(new A);
try {
....
}
catch (std::exception& e) {
....
}