自动释放阵列
Automatically deallocate array?
我正在寻找一种自动释放wchar_t
s数组的方法-有点像自动指针(我不太熟悉std::auto_ptr,但我认为它不能用于数组)。
我现在的代码是:
/* volume is of type wstring,
* hr is of type HRESULT,
* VSS_PWSZ equals wchar_t*
*/
VSS_PWSZ pwszVolume = new wchar_t[volume.size() + 1];
std::copy(volume.begin(), volume.end(), &pwszVolume);
pwszVolume[volume.size()] = 0;
hr = pDiffMgmt->QueryDiffAreasOnVolume(pwszVolume, &pEnumMgmt);
delete[] pwszVolume;
pwszVolume = NULL;
我真的不明白为什么这个愚蠢的函数不能接受const wchar_t*
,否则我可以通过volume.c_str()
。
到目前为止还好,我认为我的代码解决了这个问题,但是现在内存管理变得越来越复杂:我必须复制delete[]
代码来解释可能抛出的异常(并且我不想在此时捕获)
是否有一种方法可以让pwszVolume
在当前作用域离开时自动解除分配?
使用std::vector<它是你的基本c++数组(或者std::wstring,如果你想像操作字符串一样操作它)。>
std::vector<wchar_t> pwszVolume(volume.begin(), volume.end());
pwszVolume.push_back(0);
hr = pDiffMgmt->QueryDiffAreasOnVolume(&pwszVolume[0], &pEnumMgmt);
问题可能是。QueryDiffAreasOnVolume()对数据做什么?
也许你不需要把它抄出来
std::unique_ptr
可用于如下数组:
std::unique_ptr<wchar_t[]> pwszVolume(new wchar_t[volume.size() + 1]);
另一个选项是std::array
。
但是我同意Martin的回答,你应该只使用std::vector
,除非你真的负担不起vector类保存的两个额外指针。
正如其他人所说,到目前为止,std::vector
是首选的解决方案。否则(例如,如果您最初从第三方获得指针你不能修改的软件),有boost::scoped_array
或boost::shared_array
.
如果您不想要std::vector的开销,请使用boost::array。它是静态大小的基本c++数组。
您可以将wchar_t*包装在类中,在析构时释放内存,并且您有一个对象,当它失去作用域时将自动释放。
相关文章:
- 释放错误后堆使用
- OpenMP阵列性能较差
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 位阵列上的快速AND运算
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 阵列必须使用大括号封闭的初始器进行初始化
- 如何释放子阵列的mem,它是更大数组的一部分
- 如何释放阵列内存
- 在JNI呼叫中使用后,应删除/释放JarrayObject(字符串阵列)
- 无法从阵列队列中手动释放内存
- 重新分配已删除的阵列并读取释放的内存
- 动态分配的阵列,双释放或损坏
- 在函数中定义一个动态数组,然后返回数组元素。如何释放阵列的内存?
- 自动释放阵列
- 在释放数据之前,请先将阵列填满
- 如何为Boost多阵列释放内存