问题描述
int main()
{
wchar_t *wTemp = new wchar_t[ArrSize];
std::vector<char> SourceVector;
std::vector<std::wstring> DestinationVector;
for (int i = 0; i < ArrSize; i++)
{
SourceVector.push_back(i);
}
int k = 0;
for (size_t i = 0; i < SourceVector.size(); i++)
{
k += swprintf(wTemp + k,ArrSize,L"%u",SourceVector[i]);
}
DestinationVector.push_back(wTemp);
delete[] wTemp;
return 0;
}
我正在声明使用“ new”关键字创建的char数组。由于使用了new关键字,因此我在最后使用了delete []关键字创建了数组。
我有一个带有某些数据的SourceVector。 SourceVector中的数据存储在wTemp数组中,并将数组指针传递给DestinationVector,以将数组中的值存储到DestinationVector。
但是有时候
DestinationVector.push_back(wTemp);
出现错误“ ConsoleApplication1.exe中0x77408509(ntdll.dll)的未处理异常:0xC0000374:堆已损坏(参数:0x774458A0)。”
还行
delete[] wTemp;
总是给出相同的错误。
我在做什么错了?
解决方法
无论从ArraySize
开始在数组中的哪个位置,您始终最多写wTemp + k
个字符,这将导致缓冲区溢出。
k += swprintf(wTemp + k,ArrSize-k,L"%u",SourceVector[i]);
是正确的调用,但这只会显示错误的真正原因。 swprintf
在每个字符串后附加\0
(实际上只写n-1
个字符),如果向量恰好是完整的,则您不会在数组中保留位置。
请不要使用原始指针,std::unique_ptr<wchar_t[]>
可以正常工作。但是在我看来,您可以直接将其附加到std::wstring
上,然后将其添加到目标向量中。