使用 new 导致错误声明数组后删除 [] 关键字
delete[] keyword after declaring array using new causing error
我有下面的代码片段。
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”关键字创建的字符数组。由于使用了 new 关键字,我在最后为创建的数组使用了 delete[] 关键字。
我有一个带有一些数据的 SourceVector。 SourceVector 中的数据存储在 wTemp 数组中,并将数组指针传递给 DestinationVector 以将数组中的值存储到 DestinationVector。
但是,有时
DestinationVector.push_back(wTemp);
给出错误“ConsoleApplication1.exe 中 0x77408509 (ntdll.dll) 的未处理异常:0xC0000374:堆已损坏(参数:0x774458A0)。”
此外,行
delete[] wTemp;
总是报同样的错误。
我做错了什么?
无论您通过 wTemp + k
在数组的哪个位置开始,您总是最多写入 ArraySize
个字符,这将导致缓冲区溢出。
k += swprintf(wTemp + k, ArrSize-k, L"%u", SourceVector[i]);
是正确的调用,但这只会揭示错误的真正来源。 swprintf
将 [=14=]
附加到每个字符串(实际上只写入 n-1
个字符),如果向量恰好已满,则您没有在数组中为其保留位置。
请不要使用原始指针,std::unique_ptr<wchar_t[]>
可以安全地正常工作。但在我看来,您可以直接附加到 std::wstring
,然后将其添加到目标向量。
我有下面的代码片段。
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”关键字创建的字符数组。由于使用了 new 关键字,我在最后为创建的数组使用了 delete[] 关键字。
我有一个带有一些数据的 SourceVector。 SourceVector 中的数据存储在 wTemp 数组中,并将数组指针传递给 DestinationVector 以将数组中的值存储到 DestinationVector。
但是,有时
DestinationVector.push_back(wTemp);
给出错误“ConsoleApplication1.exe 中 0x77408509 (ntdll.dll) 的未处理异常:0xC0000374:堆已损坏(参数:0x774458A0)。”
此外,行
delete[] wTemp;
总是报同样的错误。
我做错了什么?
无论您通过 wTemp + k
在数组的哪个位置开始,您总是最多写入 ArraySize
个字符,这将导致缓冲区溢出。
k += swprintf(wTemp + k, ArrSize-k, L"%u", SourceVector[i]);
是正确的调用,但这只会揭示错误的真正来源。 swprintf
将 [=14=]
附加到每个字符串(实际上只写入 n-1
个字符),如果向量恰好已满,则您没有在数组中为其保留位置。
请不要使用原始指针,std::unique_ptr<wchar_t[]>
可以安全地正常工作。但在我看来,您可以直接附加到 std::wstring
,然后将其添加到目标向量。