自动释放阵列

Automatically deallocate array?

本文关键字:阵列 释放      更新时间:2023-10-16

我正在寻找一种自动释放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_arrayboost::shared_array .

如果您不想要std::vector的开销,请使用boost::array。它是静态大小的基本c++数组。

您可以将wchar_t*包装在类中,在析构时释放内存,并且您有一个对象,当它失去作用域时将自动释放。