2

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

6 回答 6

8

此代码将为第一个 auto_ptr 对象打印一个 NULL 地址,为第二个对象打印一些非 NULL 地址,表明源对象在分配期间丢失了引用 (=)。

于 2011-05-27T04:07:59.813 回答
1

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 被销毁时,我会被删除

于 2011-05-27T04:08:44.697 回答
1

对于这个程序,auto_ptr就像一个普通的指针,除了:

  • delete当它超出范围时,它是任何仍然指向的对象
  • 如果您从一个 auto_ptr 对象复制到另一个对象,则复制的对象将“忘记”它一直在跟踪的对象

因此,x最初取 的值i。然后y=x有效地要求x忘记i(通过存储 NULL 哨兵值),并y记住i. 然后打印 get 返回的指针值将显示 NULL/0x和非 NULL 值(匹配iy。然后 asmain()返回,y离开x作用域,并且 asy持有非 NULL 指针值匹配i,它将deleteint 对象,释放堆内存。

于 2011-05-27T04:09:01.933 回答
1

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;
}
于 2011-05-27T04:05:49.437 回答
1

简而言之,auto_ptr它是一个模板化对象,当其变量超出范围时,将调用其析构函数并释放其获取的内存。它是智能指针的更简单版本之一。

于 2011-05-27T04:08:08.423 回答
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) {
    ....
}
于 2011-05-27T04:26:58.860 回答