C++(不是 C++11)在非常大的方法中释放数组的最佳方式
C++ (not C++11) Best way to release array in very large methods
我必须修改一个非常大的方法,其中包含许多可能的执行流程。修改涉及使用 new
在堆中分配一个 char 数组。我想确保这个数组被正确释放,但我想避免在所有可能的执行流程中执行 delete[]
的需要。此外,我想为此做一些事情 "cleaner" 以避免将来出现错误。
我想用 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[]
。
std::vector
没有 new
ed 指针的移动构造函数。会发生什么,是为 std::vector
使用制作了一个副本。所以你仍然需要删除。
您可以创建长度为 1024 的 vector<char>
,然后使用指向其第一个元素的指针作为 rawPtr。以后就不用调用new
和delete[]
了。
我必须修改一个非常大的方法,其中包含许多可能的执行流程。修改涉及使用 new
在堆中分配一个 char 数组。我想确保这个数组被正确释放,但我想避免在所有可能的执行流程中执行 delete[]
的需要。此外,我想为此做一些事情 "cleaner" 以避免将来出现错误。
我想用 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[]
。
std::vector
没有 new
ed 指针的移动构造函数。会发生什么,是为 std::vector
使用制作了一个副本。所以你仍然需要删除。
您可以创建长度为 1024 的 vector<char>
,然后使用指向其第一个元素的指针作为 rawPtr。以后就不用调用new
和delete[]
了。