Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动取消分配阵列?_C++_Memory Management - Fatal编程技术网

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]);