这个auto_ptr程序是如何工作的以及它的作用?

时间:2011-05-27 04:00:59

标签: c++ pointers smart-pointers auto-ptr

我运行了这个程序,但是我没有得到这个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;
}

6 个答案:

答案 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当它超出范围时,任何仍然指向的对象
  • 如果您从一个auto_ptr对象复制到另一个auto_ptr对象,则复制的对象将“忘记”它所跟踪的对象

因此,x最初采用i的值。然后y=x有效地要求x忘记i(通过存储NULL sentinel值),并y来记住i。然后打印get返回的指针值将显示x的NULL / 0和i的非NULL值(匹配y)。然后,当main()返回时,yx会保留范围,而y保持非空指针值匹配i,它将{{1} int对象,释放堆内存。

答案 5 :(得分:0)

auto_ptr接管对象的所有权。需要注意的重点是

  • 删除内部对象
  • 复制/分配auto_ptrs转移所有权
  • 它将在c ++ 0x中弃用,并替换为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) {
    ....
}