C++ 自动取消分配阵列?
我正在寻找一种自动释放C++ 自动取消分配阵列?,c++,memory-management,C++,Memory Management,我正在寻找一种自动释放wchar\u ts数组的方法——有点像自动指针(我并不真正熟悉std::auto\u 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
wchar\u t
s数组的方法——有点像自动指针(我并不真正熟悉std::auto\u 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;
我真的不明白为什么这个愚蠢的函数不能接受一个常量wchar\u t*
,否则我只能通过volume.c\u str()
到目前为止,我认为我的代码解决了这个问题,但现在内存管理变得越来越复杂:我必须复制delete[]
代码来解释可能抛出的异常(此时我不想捕获)
是否有一种方法可以在当前的作用域下自动释放<代码> PWSZSt卷 使用STD::vector:它是你的基本C++数组(或者STD::WString,如果你想把它像字符串一样操纵)。
std::vector pwszVolume(volume.begin(),volume.end());
pwszVolume.push_back(0);
hr=pDiffMgmt->QueryDiffAreasOnVolume(&pwszVolume[0],&pEnumMgmt);
问题可能是。QueryDiffAreasOnVolume()对数据有什么作用?也许您不需要将其复制出来。
std::unique\u ptr
可以与数组一起使用,如下所示:
std::unique_ptr<wchar_t[]> pwszVolume(new wchar_t[volume.size() + 1]);
std::unique_ptr pwszVolume(新的wchar_t[volume.size()+1]);
另一个选择是
但是我同意Martin的观点,你应该只使用一个
std::vector
,除非你真的负担不起vector类拥有的两个额外指针。你可以在一个类中包装wchar\u t*,在析构函数或上释放内存,则当对象失去作用域时,该对象将自动释放。如果不想从std::vector中获得开销,请使用。它是你的基本C++数组,具有静态大小。 正如其他人所说,std::vector
是目前首选的解决方案。
否则(例如,您最初从第三方获得指针
您无法修改的软件),有boost::scoped_array
或
boost::shared_array
如果该函数在其第一个参数中从未实际写入数组,则可以丢弃常量。如果你非常非常确定,你可以直接从一个范围构造一个向量
,不需要std::copy
。使用std::vector pwszVolume(volume.begin(),volume.end());pwszVolume.push_back(0)
wstring
对我没有帮助,但是谢谢你的vector
代码。(如果使用push_back
而不是copy
的代码刚好到达向量上必须出现调整大小的边界,那么它可能会变慢,但由于简洁性,我仍然会选择此选项。)@Felix Dombek:卷的类型是什么?如果“0”已经是一个尾随“\0”的字符串,我们可能不需要推送它@Felix Dombek:不幸的是,不需要推送。除非在字符串中显式添加“\0”,否则终止“\0”不是长度的一部分,仅在调用c_str()时才会出现。但我相信新标准has data()返回一个指向以“\0”结尾的区域的指针。所以你可以这样做:newV(&v.data[0],&v.data[v.size()+1])
,但我会先验证一下,然后再相信我的话。或者如果boost不是一个选项,那么会有什么开销?请看,但我大体上同意std:array或boost::array是一个很好的选择。@马丁:您显示的链接是动态分配的数组之间的比较。tr1阵列不是动态分配的。“动态分配肯定会有开销。@本杰明·林德利:我没有意识到这一点。我还不完全熟悉新标准。但这很有趣,为什么我要使用std::数组而不是普通语言数组?@Martin:有几个原因。它避免了与指针衰减相关的错误。它具有方便的功能,如开始
和结束
,以及rbegin
和rend
等更难使用的指针。使用at()
等进行边界检查……我花了一秒钟才记住这一点-
std::unique_ptr<wchar_t[]> pwszVolume(new wchar_t[volume.size() + 1]);