【问题标题】:C++ (not C++11) Best way to release array in very large methodsC++(不是 C++11)在非常大的方法中释放数组的最佳方法
【发布时间】: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


【解决方案1】:

您可以创建长度为 1024 的vector&lt;char&gt;,然后使用指向其第一个元素的指针作为 rawPtr。那就不用再打电话给newdelete[]了。

【讨论】:

  • 在这种情况下,我更喜欢保留对原始指针的引用,因为该方法非常大,并且此原始指针被大量使用(我希望尽可能少地进行更改)。所以,我想知道 std::vector 是否确保指针将被释放,即使您有对原始指针的引用。
  • 是的,std::vector 会在析构函数中释放它的内存,即使你还有指向它的元素的指针
  • @Dan 你可以通过&amp;vec.front() 得到一个原始指针。该指针的行为将与您现在拥有的原始指针完全相同,因此您拥有与您想要的完全相同的东西。
【解决方案2】:

std::vector 没有 newed 指针的移动构造函数。发生的情况是,为std::vector 的使用制作了一份副本。所以你仍然需要删除。

【讨论】:

  • 那么,如果我这样做了std::vector&lt;char&gt; a(new char[....]);,我还需要引用new char[...] 来删除它吗?有没有其他方法可以以干净的方式执行删除?
  • @Dan 这个构造函数不存在。您无法使用向量来管理外部分配的数组。这根本行不通。使向量分配数组,然后使用指向该数组的指针。这就是你想要的。
  • 是的,对不起,我指的是:char x = new char[X];向量 a(x, x + X)。在这种情况下,向量会收到@stackptr 所说的副本?
  • @Dan 是的,永远!向量不知道您传入哪种迭代器或如何/是否管理它们。它只是复制范围。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 2011-03-01
  • 2012-09-01
  • 2011-11-01
  • 1970-01-01
  • 2013-05-18
  • 2012-12-28
  • 2013-09-05
相关资源
最近更新 更多