我正在寻找一种方法来自动解除分配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
自动解除分配?
答案 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_array
或
boost::shared_array
。
答案 3 :(得分:0)
你可以在一个类中包装wchar_t *,在destruct上释放内存,或者你有一个在失去作用域时会自动释放的对象。
答案 4 :(得分:0)
如果您不想从std :: vector获得开销,请使用boost::array。它是具有静态大小的基本C ++数组。