由于新()或malloc,内存泄漏

Memory leak because of new() or malloc

本文关键字:内存 泄漏 malloc 于新      更新时间:2023-10-16

我正在尝试实现常规连续动态阵列的替代方案,在那里我使用的是指针的向量,每个阵列都指向一个常数大小数组,称其为xvector。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

对于一定的输入限制(例如150个元素(,它可以正常工作,但是除此之外,它开始抛出异常。

我尝试使用"新和删除"而不是" malloc and free",它确实增加了极限 - 说约1200个元素 - 但仍然存在相同的问题。

我正在使用C 。

这是我的主要程序:

XVector<int> xv;
for(int i=0;i<1210;i++){
    int temp = rand()%100;
    xv.pushBack(temp);
}

for(int i=0;i<xv.size();i++){
    cout<<xv.getValue(i)<<" ";
}
cout<<"nn"<<xv.capacity();
return 0;

这是xvector(thed标头文件的类:

private:
    const int b = 10;
    vector<T*> arr;
    int currentIndex;
    int maxSize;

protected:
    void expand(){
        T* temp = new T[b];
        arr.push_back(temp);
        maxSize+=(b);
    }
    void shrink(){
        delete[] arr[arr.size()-1];
        arr[arr.size()-1] = NULL;
        arr.pop_back();
        maxSize-=(b);
    }
    int ceil(float num) {
        int inum = (int)num;
        if (num == (float)inum) {
            return inum;
        }
        return inum + 1;
    }
    pair<int,int> position(int index){
        pair<int,int> pos;
        float result = ((float)index/b);
        pos.first = result; //Row #
        pos.second = ceil((result - pos.first)*b); //Exact cell in the row
        return pos;
    }

    public:
    XVector(){
        currentIndex=0;
        maxSize=b;
        arr.reserve(120);
        arr.push_back(new T[b]);
    }
    void pushBack(T value){
        if(currentIndex>=maxSize-1){expand();}
        pair<int,int> indeces = position(currentIndex);
        arr[indeces.first][indeces.second]=value;
        currentIndex++;
    }
    void popBack(){
        currentIndex--;
        if(maxSize>=currentIndex+(2*b)){shrink();}
    }
    T getValue(int index){
        pair<int,int> indeces = position(index);
        return arr[indeces.first][indeces.second];
    }
    void setValue(int index,T value){
        pair<int,int> indeces = position(index);
        arr[indeces.first][indeces.second] = value;
    }
    int capacity(){
        return maxSize;
    }
    int size(){
        return currentIndex;
    }
    bool empty(){
        return currentIndex==0?true:false;
    }

ps:我尝试使用valgrind,但无法识别确切的问题。

您的程序会泄漏内存,因为您永远不会释放毁灭者中的指针。您必须实现驱动器来求解内存泄漏(除了移动构造函数,复制构造函数,分配副本和作业移动(。

除Valgrind外,您还可以使用ASAN,它具有更好的输出且运行速度更快。

导致代码崩溃的代码的主要问题不是内存泄漏。完全记忆泄漏不会在短期内崩溃。在内存泄漏案例中,您的应用程序可以正常工作,直到RAM上有足够的空间,然后如果您的RAM已满,则会发生崩溃。您在 position((方法中犯了一个错误。

例如,当您调用位置(索引:29(时,由于float的实现和float Precision的结果(结果-os.first(*B is 9.00000095 。这意味着其结果与实际结果有一点差异(9(。然后您致电 CEIL(9.00000095(,结果返回10。这意味着您可以访问第二维索引10,而您可以使用0到9的索引,并且您的索引范围不超出范围访问,从而导致您在一段时间后崩溃,并且您的程序可能具有未定义的行为。

正确的位置方法样本是:

pair<int, int> position(int index){
    pair<int, int> pos;
    float result = ((float)index / b);
    pos.first = result; //Row #
    pos.second = index%b; // changed line
    return pos;
}

最后,您应该定义驱动器并删除由新操作员分配的所有记忆。所有向量元素(数组(都需要删除。