【发布时间】:2013-08-31 16:21:20
【问题描述】:
我正在尝试删除旧应用程序的所有 delete 和 delete[] 并改用智能指针。在下面的代码 sn-p 中,我想删除最后一个 for cicle。
std::unique_ptr<MapiFileDesc> fileDesc(new MapiFileDesc[numFiles]);
for (int i = 0; i < numFiles; ++i)
{
// Works but I've to delete[] at the end
fileDesc[i].lpszPathName = new CHAR[MAX_PATH];
// Does not work. For each iteration the previous array will be deleted
// It also happens with shared_array
boost::scoped_array<CHAR> pathName(new CHAR[MAX_PATH]);
fileDesc[i].lpszPathName = pathName.get();
}
// I want to remove the following cicle
for (int i = 0; i < numFiles; ++i)
{
delete [] fileDesc[i].lpszPathName;
fileDesc[i].lpszPathName = nullptr;
}
对于这种情况,你认为最好的方法是什么:使用一个包装对象来跟踪所有创建的数组并在析构函数中删除它们,或者使用 boost::shared_array 的向量并将它们分配给每个要素?
std::vector<boost::shared_array<CHAR> > objs;
for (int i = 0; i < 10; ++i)
{
objs.push_back(boost::shared_array<CHAR>(new CHAR[MAX_PATH]));
}
我需要使用 boost::shared_ptr,因为我使用的是 VC++ 2008
提前致谢。 J. Lacerda
【问题讨论】:
-
使用
std::string。 -
如果你使用
new[]进行分配,你需要std::unique_ptr<MapiFileDesc[]>。但是,是的,请改用std:string。 -
@juanchopanza 只是为了好奇,这是 C++11 唯一的语法,还是也可以与(旧的)
std::auto_ptr一起正常工作? -
对不起。输入时出错。
-
@g-makulik 我认为它不适用于
auto_ptr。
标签: c++ visual-c++ memory-management smart-pointers raii