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