普通指针vs自动指针(std :: auto_ptr)

时间:2010-04-23 06:25:18

标签: c++ pointers auto-ptr

代码段(普通指针)

int *pi = new int;
int i = 90;
pi = &i;
int k = *pi + 10;
cout<<k<<endl; 
delete pi;

[Output: 100]

代码段(自动指针)

案例1:

std::auto_ptr<int> pi(new int);
int i = 90;
pi = &i;
int k = *pi + 10; //Throws unhandled exception error at this point while debugging.
cout<<k<<endl;
//delete pi; (It deletes by itself when goes out of scope. So explicit 'delete' call not required)

案例2:

std::auto_ptr<int> pi(new int);
int i = 90;
*pi = 90;
int k = *pi + 10;
cout<<k<<endl;

[Output: 100]

有人可以告诉为什么它不能用于案例1吗?

2 个答案:

答案 0 :(得分:2)

您尝试将auto_pt r绑定到堆栈分配变量。

std::auto_ptr<int> pi(new int);
int i = 90;
pi = &i;

永远不要尝试这样做 - 只将auto_ptr绑定到使用new分配的变量。否则auto_ptr将尝试delete堆栈分配变量和那是未定义的行为。

答案 1 :(得分:2)

案例1 无法编译,因为您根本无法为auto_ptr分配普通指针。如果要更改auto_ptr正在处理的指针,可以使用重置方法:

pi.reset(&i);

现在pi将删除之前存储的指针。

但是,在这里,您将存储堆栈分配变量的地址,不得删除std::auto_ptr的目的是管理动态分配的变量。


您在VC ++ 2005中观察到的内容似乎是一个功能实现的错误(指向std::auto_ptr的指针的能力),这在标准中显然是未指定的(无论是否应该编译) 。

下一个标准std::auto_ptr无论如何都会被弃用,因此您可能会尝试使用更智能的智能指针(boost::scoped_ptrboost::shared_ptr)。