我的数组大小调整代码在新数据上引发异常[size_t]
My array resizing code is throwing an exception on new Data[size_t]
我有一个自定义存储类型,有一个底层数组。但是,我的 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));
没有它,您的数组会在第一个不完整的副本后损坏。从那里,可能会导致对与堆相关的数据进行意外写入(在其他代码中(访问,这会导致下一次分配失败。
如果这不能解决它,请启发我们大小(数据(。并在此代码中添加调试打印。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 大于65535的C++数组[size]引发不一致的溢出
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 在抛出异常后,我可以信任 vector::size 吗?