为什么我会收到错误 "malloc(): corrupted top size"?
Why do i get the error "malloc(): corrupted top size"?
我正在尝试使用动态数组实现堆栈:
class stackArray{
public:
stackArray(){mainArr = new int[arrSize];}
void push(int data){
if(curr > arrSize){
int *newArr = new int[arrSize*2];
for(int i = 0 ; i < arrSize; ++i){
newArr[i] = mainArr[i];
}
arrSize *= 2;
delete []mainArr;
mainArr = newArr;
}
mainArr[++curr] = data;
}
void print(){ // debug
for(int i = 0; i < arrSize; ++i){
std::cout << mainArr[i];
}
std::cout << std::endl;
}
private:
int *mainArr;
int curr = -1;
int arrSize = 10;
};
并且出于某种原因,每当 curr > arrSize
为真并分配一个名为 newArr
的新内存时,它会生成 malloc(): corrupted top size
。我还是动态内存的新手,我不明白这个错误。谁能解释一下以及如何解决这个问题?
最初数据成员 curr
等于 tp -1
.
现在为了简单起见,我们假设数据成员 arrSize
的初始值等于 1
。那就是构造函数动态分配了一个只有一个元素的数组。
因此,由于 curr
不大于 arrSize
,因此您在函数 push
中设置 mainArr[0]
。现在 curr
等于 0
mainArr[++curr] = data;
同样 curr
不大于 arrSize
。因此,在下一次 push 调用中,您试图覆盖不属于动态分配数组的内存,您正尝试使用表达式 mainArr[1]
.
访问内存
您需要正确更新函数中的 if 语句。例如
if( !( curr + 1 < arrSize ) ){
注意函数 print
通常是不正确的,因为您没有初始化新分配的动态数组的所有元素。
void print(){ // debug
for(int i = 0; i < arrSize; ++i){
std::cout << mainArr[i];
}
std::cout << std::endl;
}
我正在尝试使用动态数组实现堆栈:
class stackArray{
public:
stackArray(){mainArr = new int[arrSize];}
void push(int data){
if(curr > arrSize){
int *newArr = new int[arrSize*2];
for(int i = 0 ; i < arrSize; ++i){
newArr[i] = mainArr[i];
}
arrSize *= 2;
delete []mainArr;
mainArr = newArr;
}
mainArr[++curr] = data;
}
void print(){ // debug
for(int i = 0; i < arrSize; ++i){
std::cout << mainArr[i];
}
std::cout << std::endl;
}
private:
int *mainArr;
int curr = -1;
int arrSize = 10;
};
并且出于某种原因,每当 curr > arrSize
为真并分配一个名为 newArr
的新内存时,它会生成 malloc(): corrupted top size
。我还是动态内存的新手,我不明白这个错误。谁能解释一下以及如何解决这个问题?
最初数据成员 curr
等于 tp -1
.
现在为了简单起见,我们假设数据成员 arrSize
的初始值等于 1
。那就是构造函数动态分配了一个只有一个元素的数组。
因此,由于 curr
不大于 arrSize
,因此您在函数 push
中设置 mainArr[0]
。现在 curr
等于 0
mainArr[++curr] = data;
同样 curr
不大于 arrSize
。因此,在下一次 push 调用中,您试图覆盖不属于动态分配数组的内存,您正尝试使用表达式 mainArr[1]
.
您需要正确更新函数中的 if 语句。例如
if( !( curr + 1 < arrSize ) ){
注意函数 print
通常是不正确的,因为您没有初始化新分配的动态数组的所有元素。
void print(){ // debug
for(int i = 0; i < arrSize; ++i){
std::cout << mainArr[i];
}
std::cout << std::endl;
}