首页 文章

我该如何解决这个错误? CRT检测到应用程序在堆缓冲区结束后写入内存

提问于
浏览
0

我一直在尝试制作一个动态数组 . 我的main方法调用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 回答

  • 1

    在你的 push_back 函数中你有这个循环:

    for (int i = size() - 1; i >= 0; i--) {
        arrayPtr[i + 1] = arrayPtr[i];
    }
    

    这里 size() - 1 是顶级索引,因此在第一次迭代中,当你执行 i + 1 时,你已经超出了界限 .

    此外,这个函数被称为 push_back ,但它试图添加到前面?如果它添加到最后("back")你将不需要循环,并且你的问题将消失"magically" .

相关问题