如何从函数返回动态分配的数组并正确删除它

时间:2018-05-27 09:13:20

标签: c++ c++11 memory memory-management memory-leaks

我是C ++的新手,我的内存管理存在问题。

我有一个函数a(),它调用3个函数(b()c()d()),每个函数返回一个动态分配的{{1}数组对象:

MyClass

void a(){ MyClass * one=b(); MyClass * two=c(); MyClass * three=d(); //operate with 3 array (one, two and three) delete [] one; delete [] two; delete [] three; } MyClass * b(){ MyClass * array=new MyClass[2000]; //many operations on array return array; } MyClass * c(){ MyClass * array=new MyClass[2000]; //many operations on array return array; } MyClass * d(){ MyClass * array=new MyClass[2000]; //many operations on array return array; } 中进行多次操作后,我必须删除使用3个函数创建的3个数组。如果我使用上面代码中的3个a()表达式来表达,那可以吗?

我问自己这个问题,因为我认为这段代码正确地释放了所有内容,但是分析了我的c ++程序的内存分配,我没有看到这种删除的证据。

2 个答案:

答案 0 :(得分:5)

为了可靠的内存管理,您应该使用智能指针,例如std::unique_ptr。因此,当您的函数返回动态分配的值时,它应该将std::unique_ptr返回到该值,以确保将释放此值。

std::unique_ptr<MyClass[]> array(new MyClass[2000]);

在您的情况下,您应该考虑使用std::vector而不是原始数组。

答案 1 :(得分:3)

是的,你正在做的是正确的。

但请注意,手动内存管理容易出现错误,无论是内存泄漏还是双重删除。忘记裸new,特别是delete更好 ,而是使用RAII类来安全地处理它。

在您的情况下,您应该使用std::vector替换指向动态分配的数组的指针。 std::vector 在C ++中拼写“动态分配的数组”的方法。一旦你这样做,你就会知道即使存在异常,向量也会正确地释放内存。

这是std::vector代码的代码:

void a(){
    auto one=b();
    auto two=c();
    auto three=d();
    //operate with 3 array (one, two and three)

    //nothing to do here, the vectors will deallocate memory correctly when they go out of scope
}

std::vector<MyClass> b(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

std::vector<MyClass> c(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

std::vector<MyClass> d(){
    std::vector<MyClass> array(2000);
    //many operations on array
    return array;
}

至于为什么你看不到解除分配的影响:delete释放的内存不需要立即返回给操作系统。通常,C ++运行时将保留它并使用它来满足程序的未来分配要求。