gpt4 book ai didi

c++ - 删除指向数组 C++ 的数组指针时出错

转载 作者:行者123 更新时间:2023-11-30 03:54:29 26 4
gpt4 key购买 nike

我目前正在创建一个用 C++ 模拟高尔顿板的程序。我了解如何创建一个指针,创建一个指针数组,并将每个指针指向另一个整数数组。当我尝试 descruct 我的指针数组时,我的问题出现了,它告诉我:

“调试错误!

检测到堆损坏:在 0x0115E978 处的正常 block (#927) 之后。CRT 检测到应用程序在堆缓冲区结束后写入内存。”

我一直在用这个方法撞墙,因为我在网上找到的所有示例似乎都采用了这种方法。我什至将我的程序重写成一个类,以使其更简单。程序运行并完全按照预期的方式运行,直到 ob1 开始 descruct,这就是程序呕吐的时候。我卡住了。

这是我的代码:

#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using namespace std;

class foo
{
public:
foo();
foo(int);
~foo();
void allocateSpace();
void runGame();
void printResults();
private:
int bins;
int** p;
};

foo::foo()
{
this->bins = 0;
}

foo::foo(int bins)
{
this->bins = bins;
this->p = new int*[bins]; //setting p to array of pointers
}

foo::~foo()
{
for (int i = 0; i < bins; i++)
{
delete[] this->p[i];
}
delete[] p;
}

void foo::allocateSpace()
{
for (int i = 0; i < bins; i++)
{
this->p[i] = new int[i]; //creatung an int array of size i at each pointer array cell

for (int j = 0; j <= i; j++)
{
this->p[i][j] = 0;
}
}
}

void foo::runGame()
{
const int numOfRuns = 1000;
for (int i = 0; i < numOfRuns; i++)
{
this->p[0][0]++; //each ball hits the first peg, so always increment it before anything else
int j = 0; //setting j = 0 sets it to the left
for (int i = 1; i < bins; i++)
{
int rando = rand() % 2;
if (rando == 1) //move right
{
j++;
}
this->p[i][j]++;
}
}
}

void foo::printResults()
{
for (int i = 0; i < bins; i++)
{
for (int j = 0; j <= i; j++)
{
cout << setw(5) << this->p[i][j];
}
cout << endl;
}
}

int main()
{
srand(time(0));
int numOfBins;

cout << "Enter the number of bins: ";
cin >> numOfBins;
cout << endl;

foo ob1(numOfBins);

for (int i = 0; i < 50; i++)
{
ob1.allocateSpace();
ob1.runGame();
ob1.printResults();
}

system("pause");
return 0;
}

如有任何帮助,我们将不胜感激。

最佳答案

allocateSpace ,你写超出分配的对象。这会破坏您的堆。

    this->p[i] = new int[i];

for (int j = 0; j <= i; j++)
{
this->p[i][j] = 0;
}

printResults有一个类似的问题:你读取超出分配的对象。

然后,在runGame ,您尝试递增一个 0 大小的对象。

    this->p[0][0]++;

修复:

看来您需要将分配增加 1。

    this->p[i] = new int[i+1];

这将避免堆损坏问题。您仍然存在内存泄漏问题,因为您在 main() 中的每次迭代中都在现有内存之上分配了新内存。 .

如果您采用 vector<>,您的代码会更安全而不是管理动态分配的数组。

关于c++ - 删除指向数组 C++ 的数组指针时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com