删除指针内存分配以避免内存泄漏

Delete pointer memory allocation to avoid memory leak

本文关键字:内存 泄漏 分配 指针 删除      更新时间:2023-10-16

我想删除 FOR 循环末尾的指针以避免内存泄漏。但是,在 FOR 循环的中间,它可能会遇到一个条件if (i > maxHour / 2) continue;并从头开始继续返回。为了避免内存泄漏,我试图if (NULL != p) delete[] p;进行此检查,但程序无法编译。我不确定这条线有什么问题if (NULL != p) delete[] p;

   int main() {
        int maxHour = 8760;
        int *p;
        for (int i = 0; i < maxHour; i++) {
            if (NULL != p) delete[] p;
            p = new int[100];
            //do some things 1
            if (i > maxHour / 2) continue;
            //do some things 2
            delete[] p;
        }
    return 0;
}

几个问题。

首先,您需要将p初始化为nullptr,以便第一次迭代不会尝试访问和释放未初始化的指针。

其次,删除循环末尾的指针后,需要将其设置为 nullptr,以便下一次迭代不会再次尝试释放它。

最后,您需要在循环后释放它,以防最后一次迭代命中 continue 语句,因此它会跳过delete

int main() {
    int maxHour = 8760;
    int *p = nullptr;
    for (int i = 0; i < maxHour; i++) {
        delete[] p;
        p = new int[100];
        //do some things 1
        if (i > maxHour / 2) continue;
        //do some things 2
        delete[] p;
        p = nullptr;
    }
    delete[] p;
    return 0;
}

您不需要if (NULL != p)因为delete会自动检查空指针而不执行任何操作。

另一种方法是在继续之前删除指针。但是,如果您有许多不同的代码分支包含 continue ,这可能不方便重复。

int main() {
    int maxHour = 8760;
    int *p;
    for (int i = 0; i < maxHour; i++) {
        p = new int[100];
        //do some things 1
        if (i > maxHour / 2) {
            delete[] p;
            continue;
        }
        //do some things 2
        delete[] p;
    }
    return 0;
}

对于这样的任务,智能指针std::unique_ptr是合适的。

这是一个演示程序

#include <iostream>
#include <memory>
struct A
{
    ~A() { std::cout << "A::~A()" << std::endl; }
};
int main() 
{
    const size_t N = 10;
    for ( size_t i = 0; i < N; i++ )
    {
        std::unique_ptr<A[]> p( new A[2] );
        if ( i % 2 )
        {
            std::cout << "nContinue" << std::endl;
            continue;
        }
        std::cout << "nIteration" << std::endl;
    }
    return 0;
}

程序输出为

Iteration
A::~A()
A::~A()
Continue
A::~A()
A::~A()
Iteration
A::~A()
A::~A()
Continue
A::~A()
A::~A()
Iteration
A::~A()
A::~A()
Continue
A::~A()
A::~A()
Iteration
A::~A()
A::~A()
Continue
A::~A()
A::~A()
Iteration
A::~A()
A::~A()
Continue
A::~A()
A::~A()

可以看出,内存被正确删除,与是否执行了继续语句无关。

可以将下标运算符与此智能指针一起使用,方法与数组相同。