gpt4 book ai didi

c++ - 类析构函数中的堆损坏?

转载 作者:行者123 更新时间:2023-11-30 02:31:59 25 4
gpt4 key购买 nike

几个小时以来,我一直在努力解决这个问题,但我已经无计可施了。如果有人能在我做错时告诉我,我将不胜感激。

我写了一个 C++ 代码,其中的类实现了一个简单的堆栈,试图压入和弹出随机字符流。它似乎工作正常,但在文件末尾,它会产生某种运行时错误:

检测到堆损坏:在正常 block 之后....

由于错误发生在文件末尾,我猜测是在删除指针(类析构函数)时出现问题。但是,我不知道我写的析构函数有什么问题。

此外,经过反复试验,我发现如果我将更大的数字分配给无符号整数值 iter1(例如:80),则不会发生运行时错误。你能解释一下这里的问题是什么,以及如何绕过它吗?

堆栈.h:

class sstack
{
public:
sstack(int length = 256);
~sstack(void);
int sstackPop(char &c);
int sstackPush(char c);
bool isempty();
bool isFull();

protected:
private:
char *sstackBuffer;
int sstackSize;
int sstackIndex; // Initial = -1
};

堆栈.cpp:

#include "stack.h"
#include <iostream>
using namespace std;

sstack::sstack(int length)
{
sstackIndex = -1;
if (length > 0)
sstackSize = length;
else
sstackSize = 256;

sstackBuffer = new char[sstackSize];
}

sstack::~sstack(void)
{
delete[] sstackBuffer;
}

bool sstack::isempty()
{
if (sstackIndex < 0)
{
cout << "is empty!(isempty)" << endl;
return 1;
}
else
return 0;
}

bool sstack::isFull()
{
if (sstackIndex >= sstackSize)
return 1;
else
return 0;
}


int sstack::sstackPop(char &c)
{
if (!isempty())
{
c = sstackBuffer[sstackIndex--];
cout << sstackIndex << endl;
return 1;
}
else
{
cout << "is empty!(sstackPop)" << endl;
return 0;
}
}

int sstack::sstackPush(char c)
{
if (!isFull())
{
sstackBuffer[++sstackIndex] = c;
return 1;
}
else{
return 0;
}

}

主要.cpp:

#include <iostream>
#include "stack.h"
#include <string>
using namespace std;

int main(){
unsigned int iter1 = 5;
unsigned int iter2 = 800;

sstack stackDefault;
sstack stack1(iter1);
sstack stack2(iter2);

char buffer[80];
memset(buffer, 0x00, 80);
char BUFFER[80] = "A random stream of characters";
strcpy_s(buffer, 80, BUFFER);

for (int i = 0; i< strlen(buffer); i++)
{
cout << " stack1: " << stack1.sstackPush(buffer[i]);
cout << " stack2: " << stack2.sstackPush(buffer[i]);
cout << " stackD: " << stackDefault.sstackPush(buffer[i]);
cout << " i : "<< i << endl;
}

cout << "out of Pushes" << endl;

int i = 0;
memset(buffer, 0x00, 80);
while (!stack1.isempty())
stack1.sstackPop(buffer[i++]);

cout << buffer << endl;
getchar();

}

最佳答案

sstackBuffer[++sstackIndex] = c;

当堆栈只剩下一个元素时,将写入超过 sstackBuffer 的末尾。

如果您考虑大小为 1 的堆栈。在第一次调用 push 时,该行的计算结果为:

sstackBuffer[1] = c;

这超出了您分配的内存。

确保您了解 pre-increment and post-increment 之间的区别运营商。根据您的代码示例,我建议您在 push 中使用 post-increment,在 pop 中使用 pre-increment。

关于c++ - 类析构函数中的堆损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36919557/

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