【发布时间】:2016-08-18 13:16:07
【问题描述】:
我必须修改一个包含许多可能执行流程的非常大的方法。修改涉及使用new 在堆中分配一个字符数组。我想确保这个数组被正确释放,但我想避免在所有可能的执行流程中执行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[]。
【问题讨论】:
-
您熟悉术语 RAII 吗?如果是这样,你的问题是什么?
-
制作自己的 RAII 包装器...
-
为什么不使用
std::string? -
“C++ 标准”只有一个,目前是 2014 年发布的。如果你想引用以前的版本,或者草稿版本,你应该明确地命名它(例如“C ++98”或“C++03”在你的情况下)。标准的发布取代了以前的标准。
-
std::vector变量必须用模板参数声明
标签: c++ arrays pointers c++03 c++98