我必须使用许多可能的执行流程来修改非常大的方法。修改涉及使用new在堆中分配char数组。我想确保正确释放此数组,但我想避免在所有可能的执行流程中都需要执行delete[]。另外,我想为此做些“清洁”以避免将来的错误。

我曾考虑过使用new分配数组,然后将其包装到本地std::vector中(但保留对原始指针的引用,因为该方法大量使用了该引用),并让包装器在超出范围时删除原始指针。

在这里我举一个例子。本示例的目的是显示使用原始指针执行的操作的类型。

char *rawPtr = new char[1024];
std::vector wrapper(rawPtr, rawPtr + 1024); // <= Does it assure that rawPtr will be released properly?
...
for(int i = 0; i < 1024; i++)
    rawPtr[i] = ...;

rawPtr += sizeof(...);
...
rawPtr -= ...;
if(...)
    return ...;

return ...;

所以,我的问题是,我是否可以确保无论程序失败,异常,传入的rawPtr语句等如何,return都能正确释放。

PD .:我不能使用C++11,与智能指针最相似的是auto_ptr,它使用的是delete,而不是delete[]

最佳答案

您可以创建长度为1024的vector<char>,然后将指向其第一个元素的指针用作rawPtr。然后,无需调用newdelete[]

10-08 19:14