我运行了这个程序,但是我没有得到这个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;
}
答案 0 :(得分:8)
此代码将为第一个auto_ptr对象打印一个NULL地址,为第二个打印一个非NULL地址,表明源对象在赋值期间丢失了引用(=)。
答案 1 :(得分:1)
auto_ptr
会自动释放new
在其范围末尾分配的内存(在这种情况下,当主要退出时)。然而这个例子是相当愚蠢的,因为整数永远不会收到实际值,所以我不得不想象你看到了垃圾。
这可能更具启示性:
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;
}
答案 2 :(得分:1)
简而言之,auto_ptr
是一个模板化对象,当它的变量超出范围时,它的析构函数被调用并释放它获取的内存。它是智能指针的简单版本之一。
答案 3 :(得分:1)
auto_ptr假定您使用它构造它的指针的所有权。
即。一旦auto_ptr本身被破坏,它将自动销毁指向的对象。
auto_ptr<int> x(i)
会让x拥有我
auto_ptr<int> y
会让你不拥有任何东西
您的y=x
操作会将i *的所有权从x转移到y
所以现在y拥有i而x拥有任何东西,这意味着当x被破坏时没有任何反应,当y被销毁时我被删除
答案 4 :(得分:1)
对于这个程序,auto_ptr
就像一个普通的指针,除了:
delete
当它超出范围时,任何仍然指向的对象因此,x
最初采用i
的值。然后y=x
有效地要求x
忘记i
(通过存储NULL sentinel值),并y
来记住i
。然后打印get返回的指针值将显示x
的NULL / 0和i
的非NULL值(匹配y
)。然后,当main()
返回时,y
和x
会保留范围,而y
保持非空指针值匹配i
,它将{{1} int对象,释放堆内存。
答案 5 :(得分:0)
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) {
....
}