我该如何解决这个错误? CRT 检测到应用程序在堆缓冲区结束后写入内存
Posted
技术标签:
【中文标题】我该如何解决这个错误? CRT 检测到应用程序在堆缓冲区结束后写入内存【英文标题】:How do I fix this error? CRT detected that the application wrote to memory after end of heap buffer 【发布时间】:2016-04-08 03:33:47 【问题描述】:我一直在尝试制作一个动态数组。我的主要方法调用 push_back() 将整数添加到数组中 50 次。如果数组的大小需要加倍,则 push_back() 方法调用 grow_if_needed() 方法。 size() 方法返回数组的当前容量。 toString 方法用于将数组打印为字符串。我在 grow_if_needed() 方法结束时不断收到此错误。
#include <string>
class ArrayList
private:
static int capacity;
static int count;
public:
int& operator [](int i);
int *arrayPtr = new int[1];
ArrayList();
int * push_back(int m);
int * grow_if_needed();
int * erase(int m);
int size();
std::string toString();
;
#include "ArrayList.h"
using namespace std;
int ArrayList::capacity = 1;
int ArrayList::count = 0;
int & ArrayList::operator[](int i)
return arrayPtr[i];
ArrayList::ArrayList()
arrayPtr[0] = 0;
int * ArrayList::push_back(int m)
if (count == size())
grow_if_needed();
for (int i = size() - 1; i >= 0; i--)
arrayPtr[i + 1] = arrayPtr[i];
arrayPtr[0] = m;
count++;
return arrayPtr;
int * ArrayList::grow_if_needed()
int k;
capacity = size() * 2;
int * tempArray = new int[capacity];
for (k = 0; k < count; k++)
tempArray[k] = arrayPtr[k];
while (k != capacity)
tempArray[k] = 0;
k++;
delete [] arrayPtr;
arrayPtr = tempArray;
return arrayPtr;
int ArrayList::size()
return capacity;
string ArrayList::toString()
string num = "";
for (int i = 0; i <= size() - 1; i++)
num += std::to_string(arrayPtr[i]) + " ";
return num;
【问题讨论】:
【参考方案1】:在您的 push_back
函数中,您有这个循环:
for (int i = size() - 1; i >= 0; i--)
arrayPtr[i + 1] = arrayPtr[i];
这里size() - 1
是top 索引,所以在第一次迭代中,当您执行i + 1
时,您超出了范围。
另外,这个函数被称为push_back
,但它试图添加到front?如果它添加到末尾(“后退”),您将不需要循环,您的问题将“神奇地”消失。
【讨论】:
以上是关于我该如何解决这个错误? CRT 检测到应用程序在堆缓冲区结束后写入内存的主要内容,如果未能解决你的问题,请参考以下文章
“CRT 检测到应用程序在堆缓冲区结束后写入内存”是啥意思?
检测到 NonComVisibleBaseClass;我该如何解决?
在 URL 上使用 Imagick 的 readImageFile 时如何修复“检测到无效的 CRT 参数”错误?