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

时间:2010-09-08 02:04:13

标签: c++

上一页,我有以下代码。

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

a数组初始化为0的目的是,当我迭代删除a的元素时,即使没有为{{1}的元素分配内存,一切都会正常工作}。

a

现在,我想利用auto_ptr,避免手动调用删除。

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

我想知道,是否需要初始化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); } 来保存空指针?我的感觉是否定的。我只是想确认这一点,以便没有任何陷阱。

3 个答案:

答案 0 :(得分:6)

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

显式auto_ptr(X * p = 0)throw();

X是模板参数类,即适用于std::auto_ptr<X>)。

答案 1 :(得分:6)

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

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 :(得分:2)

您可以使用以下命令初始化阵列的所有成员:

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来保存空指针?

无需初始化auto_ptr s数组。如果您将其删除,则会默认初始化成员。

但是,请注意,如果您需要传递指向其他函数的指针,auto_ptr可能无法用于其移动语义(所有权副本)。此外,在即将推出的标准auto_ptr中可能会被弃用。尝试使用std::tr1::unique_ptrstd::tr1::shared_ptr之类的东西(后者是引用计数的智能指针)。