代码段(普通指针)
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吗?
答案 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_ptr
,boost::shared_ptr
)。