使用std :: auto_ptr的意义

Lik*_*kon 3 c++ pointers smart-pointers auto-ptr

感觉是auto_ptr什么?看看这段代码:

#include <iostream>
#include <memory>

class A
{
public:
    ~A()
    {
        std::cout << "DEST";
    };
};

void func(A* pa)
{
    std::cout << "A pointer";
}

void test()
{
    A a;
    std::auto_ptr<A> pA(new A);
    //func(pA);  //compiler error here cannot convert parameter 1 from 'std::auto_ptr<_Ty>' to 'A *' 
    std::cout << "end";
}

int main(int argc, char* argv[])
{
    test();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用它有auto_ptr什么意义?

  • 它在超出范围时调用类析构函数作为普通类初始化变量(a).
  • 我不能将此指针传递给具有类指针(func)的函数
  • 我不能使用指针auto_ptrA[]char[]因为auto_ptr的电话删除不delete[].

唯一的想法是我不必编写删除,但是当我超出范围时,如果它将被销毁,那么指针的意义是什么.我使用指针来控制变量的实时.

普通变量初始化是在堆栈上的指针和堆上的指针,但告诉我使用auto_ptr正常指针的意义是什么?

Ed *_* S. 6

唯一的想法是我不必写删除

是的,考虑到内存泄漏,这是一个非常大的好处,是你将遇到的最常见的错误之一.

当我超出范围时,如果它会被摧毁,那么指针的意义是什么?我使用指针来控制变量的实时.

你转变了这种心态,并使用范围来定义变量的生命.您只需在适当的范围内声明这些内容,而不必担心清理.这就是重点.

你的例子是人为的,但你仍然可以看出它的价值.当然,你可能不会忘记调用delete一个什么都不做的双线函数.在实际应用中,事情变得更加复杂.

当你new有一堆对象时,你可以依赖这样一个事实:当函数退出时,对象将被清理掉.课程也是如此; 当一个实例超出范围时,你可以依靠它的析构函数来为你解除内存释放.考虑抛出异常时会发生什么.如果没有auto_ptr,你需要确保你处理每一个可能的异常和每个可能的返回路径,以确保你自己清理.

也...

正常变量initialize位于堆栈上,指针位于堆上

不完全的.在这种情况下,指针具有自动存储持续时间,但它指向的却没有.

你的编译器在你传入的时候咆哮的原因auto_ptr是因为函数没有使用auto_ptr.你需要调用get()来传入指针本身.

那就是说,你不应该使用auto_ptr; 如果您有权访问C++ 0x编译器,请使用unique_ptr.