我的数组大小调整代码在新数据上引发异常[size_t]

My array resizing code is throwing an exception on new Data[size_t]

本文关键字:异常 size 数据 调整 数组 代码 新数据 我的      更新时间:2023-10-16

我有一个自定义存储类型,有一个底层数组。但是,我的 EnsureCapacity(( 方法在 new 中抛出异常。

我没有解释,也不知道如何解释。new[] 仅尝试分配 136,000 字节,计算机具有 16 GB 的 RAM。这是一台运行Visual Studio C++的相当标准的Windows 10机器,所以不应该发生任何太奇怪的事情。据我所知,我没有做任何应该影响 new[] 或 delete[] 运算符任何部分的事情。

我已经关闭并重新启动了Visual Studio,并重新启动了Windows,但错误仍然存在。坦率地说,我很困惑和无能为力。

我的代码:

void EnsureCapacity()
{
    if (count >= size)
    {
        // The array can start empty.
        size_t newSize = std::max(2, size * 2);
        // The exception is thrown here, in the new operator.
        // Proved by following the call stack, and by tracing.
        Data* newArray = new Data[newSize];
        // It never gets here, or below.
        // "values" is a simple Data* type, that is already allocated.
        memcpy(newArray, values, size);
        size = newSize;
        delete[] values;
        values = newArray;
    }
}

我不确定是否在发生异常的地方发布代码,因为它是 MS 的,而不是我的。

memcpy(newArray, values, size);

这是错误的。memcpy 取字节数。大小是您拥有的项目数。你应该使用

memcpy(newArray, values, size * sizeof(*newArray));

没有它,您的数组会在第一个不完整的副本后损坏。从那里,可能会导致对与堆相关的数据进行意外写入(在其他代码中(访问,这会导致下一次分配失败。

如果这不能解决它,请启发我们大小(数据(。并在此代码中添加调试打印。