使用新的导致错误声明数组后的delete []关键字

问题描述

我有以下代码段。

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上,然后将其添加到目标向量中。