代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

是否需要将空指针分配给std::auto_ptr

c++
  •  2
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    以前,我有以下代码。

    double* a[100];
    for (int i = 0; i < 100; i++) {
        // Initialize.
        a[i] = 0;
    }
    

    初始化数组的目的 a 到0是指,当我迭代删除元素 即使没有内存分配给元素 .

    for (int i = 0; i < 100; i++) {
        // Fine.
        delete a[i];
    }
    

    现在,我想利用auto-ptr,避免手动调用删除。

    std::auto_ptr<double> a[100];
    for (int i = 0; i < 100; i++) {
        // Initialize. Is there any need for me to do so still?
        a[i] = std::auto_ptr<double>(0);
    }
    

    我在想,是否需要初始化 auto_ptr 持有空指针?我的感觉不好。我只是想确认一下,这样就不会有任何后遗症。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Chubsdad    14 年前

    C++ 03指定AutoTypTR的构造函数如下:

    explicit auto_ptr(X* p =0) throw();             // Note the default argument
    
    Postconditions: *this holds the pointer p.
    

    这意味着下面的内容是完美的。无需初始化

    auto_ptr<int> a = auto_ptr<int>();
    
        2
  •  6
  •   Alex Martelli    14 年前

    std::auto_ptr 的默认构造函数为您执行空赋值——或者,如标准(ISO/IEC 14882:1998)所述,该构造函数声明为:

    显式auto-ptr(x*p=0)throw();

    ( X 作为模板参数类,即 std::auto_ptr<X> )

        3
  •  2
  •   dirkgently    14 年前

    可以使用以下方法对数组的所有成员进行零初始化:

    double* a[100] = {0}; // is equivalent
    

    替代删除的方法 for_each :

    struct delete_object
    {
      template <typename T>
      void operator()(T *ptr){ delete ptr;}
    };
    
    //later in the code...
    std::for_each( &a[ 0 ], &a[ 0 ] + sizeof a / sizeof a[ 0 ], delete_object());
    

    现在问你的问题:

    我是否需要初始化自动指针来保存空指针?

    无需初始化 auto_ptr S数组。如果不输入,成员将被默认初始化。

    但是,请注意 自动PTR 如果需要将指针传递给其他函数,则可能无法用于其移动语义(所有权副本)。另外,在未来的标准中 自动PTR 可能会被否决。尝试使用类似 std::tr1::unique_ptr std::tr1::shared_ptr (后者是一个引用计数的智能指针)。