【发布时间】:2020-01-12 22:51:02
【问题描述】:
所以我正在使用 realloc 和重复加倍制作一个调整大小的数组,我的数组工作正常,直到它的大小为 134217728,但只要我推动第 134217729 个元素,即我调用 134217728*2 的调整大小函数,realloc 返回 0。
我认为我的内存已满,但我有 8 Gbs 的 RAM,并且我在 Vs 代码上使用 windows 10 MinGW 32 位编译器,如果我愿意,如何进一步增加我的数组的大小。 这是 Windows 的问题还是做错了什么?
#include<iostream>
#include<string.h>
#include <ctime>
using namespace std;
template<class X>
class ArrayStack{
X* a =(int*) malloc(1 * sizeof(int));;
int top=0;
int length=1;
void resize(int size){
cout<<"resizing to "<<size<<endl;
X* temp=(X*) realloc (a, size * sizeof(X));
if(temp==0){
cout<<"No continous memory left for the stack ";
}
length=size;
a=temp;
}
public:
void push(X item){
if(top==length){
resize(length*2);
}
a[top++]=item;
}
X pop(){
if(top<=length/4){
resize(length/2);
}
return a[--top];
}
bool IsEmpty(){
return top==0;
}
};
int main(){
ArrayStack <int> newStack;
for(unsigned long long int i=0;i<134217729 ;i++){
// In case of int the max size of array stack i can make is of length 134217728 using repeated doubling and realloc
int r = rand()%1000;
newStack.push(r);
}
while(!newStack.IsEmpty()){
newStack.pop();
}
}
realloc 返回 0。
【问题讨论】:
-
不要
realloc你有什么newed。realloc只能与malloc系列的其他成员一起使用。new与realloc有可比性,主要是因为string和vector这样的容器使其无关紧要。如果你要去realloc全力以赴malloc并查找placementnew -
是的,糟糕的juju...不要将
new/delete与realloc混为一谈,谁知道可能会调用(或唤起... ) 您可以简单地创建一个new tmpX [doubled],然后从X复制到tmpX,然后delete[] X;并分配X = tmpX;以模拟realloc。 -
旁注:
malloc家族是从 C 过来的,C 不知道什么是构造函数和析构函数。如果你的malloc或realloc分配包含复杂的类,可能会发生非常讨厌的事情。 -
X* a =(int*) malloc(1 * sizeof(int));为ints 调整分配大小,但该类是在X类上模板化的。这最终会在你身上爆发。 -
@ASHUTOSHSINGH
realloc可能会复制数据。它只会在可以并且愿意的情况下扩展分配。
标签: c++ pointers memory-management new-operator realloc