自动解除分配数组?

时间:2011-07-26 14:30:28

标签: c++ memory-management

我正在寻找一种方法来自动解除分配wchar_t的数组 - 有点像autopointer(我真的不喜欢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自动解除分配?

5 个答案:

答案 0 :(得分:6)

使用std :: vector< wchar_t>它是你的基本C ++数组(或std :: wstring,如果你想像字符串一样操作它)。

std::vector<wchar_t> pwszVolume(volume.begin(), volume.end());
pwszVolume.push_back(0);

hr = pDiffMgmt->QueryDiffAreasOnVolume(&pwszVolume[0], &pEnumMgmt);

问题可能是。 QueryDiffAreasOnVolume()对数据做了什么?
也许你不需要复制它。

答案 1 :(得分:4)

std::unique_ptr可以与数组一起使用,如下所示:

std::unique_ptr<wchar_t[]> pwszVolume(new wchar_t[volume.size() + 1]);

另一个选项是std::array

但我同意Martin的answer你应该只使用std::vector,除非你真的无法承受矢量类所拥有的几个额外指针。

答案 2 :(得分:1)

正如其他人所说,到目前为止,std::vector是首选解决方案。 否则(例如,如果您最初从第三方获得指针) 您无法修改的软件),有boost::scoped_arrayboost::shared_array

答案 3 :(得分:0)

你可以在一个类中包装wchar_t *,在destruct上释放内存,或者你有一个在失去作用域时会自动释放的对象。

答案 4 :(得分:0)

如果您不想从std :: vector获得开销,请使用boost::array。它是具有静态大小的基本C ++数组。