I'm trying to remove all the delete and delete[] of an old application and use smart pointers instead. In the following code snippet, I want to remove the last 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;
}
What do you think it is the best approach for this situation: use a wrapper object that will keep track of all the arrays created and delete them in the destructor OR use a vector of boost::shared_array and assign them to each of the elements?
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]));
}
I need to use boost::shared_ptr since I'm using VC++ 2008
Thanks in advance. J. Lacerda
By the way, if you don't need to pass the whole array to C APIs but just single structs, you can make a single vector of a struct that stores both the
MapiFileDesc
structure and thestd::string
, binding strongly the lifetime of both objects and allowing the constructor to take care of linkinglpszPathName
with the stringdata()
member; still, probably I wouldn't bother if this structure is used just in a single function.