上一页,我有以下代码。
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);
}
来保存空指针?我的感觉是否定的。我只是想确认这一点,以便没有任何陷阱。
答案 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_ptr
或std::tr1::shared_ptr
之类的东西(后者是引用计数的智能指针)。