这会导致内存泄漏,从函数返回数组吗?

时间:2013-05-14 04:27:26

标签: c++ arrays pointers memory-leaks return

我有以下代码可以正常工作,但我不确定是否需要删除returned_array中的int main()指针或是否自动删除它。我猜它不会自动删除,并假设我应该在delete returned_array;完成后使用cout。有什么建议吗?

#include <iostream>

double* pass_return_array(double passed[])
{
        double* returned_array = new double[3];

        for(int index = 0; index < 3; index++)
            returned_array[index] = passed[index];

        return returned_array;
}
int main()
{
        double passed[3];
        double* returned_array;

        for(int index = 0; index < 3; index++)
            passed[index] = index + 100;

        returned_array = pass_return_array(passed);

        for(int index = 0; index < 3; index++)
            std::cout<<returned_array[index]<<std::endl;

        return 0;
}

2 个答案:

答案 0 :(得分:4)

你是对的:你在函数中创建了数组,你也负责它的释放。您应该在不再需要时立即致电delete[] returned_array;

注意,操作系统总是清除程序终止时分配的所有资源,因此不会有任何系统范围的内存泄漏。但是将解除分配留给操作系统是一种非常糟糕的做法,你应该总是释放你分配的所有资源(包括其他类型的东西 - 例如文件或画笔的句柄)。

考虑使用std::vectorstd::array - 如果用作简单的局部变量,它们将处理它们分配的内存,您不必记住它。这就是C ++在工作中的强大功能:))

答案 1 :(得分:2)

最好清理您分配的所有资源,无论您是否认为它将自动完成。

资源跟踪资源本身的责任也是一种好习惯。这意味着,如果从函数返回一些动态分配的内存,您也“返回”它的责任。

这并不是说它必须在函数调用者中清理,因为这可能会破坏封装(如果动态分配,你甚至不一定知道)。但是,即使您将资源传递回创建它的代码/库,也会按照以下伪代码再次传递责任:

def makeSomething():
    something = unknownMethodForCreatingSomething()

    #makeSomething() has responsibility here but passes it off to caller

    return something

def killSomething(something):
    # Responsibility with killSomething() at this point

    equallyUnknownMethodForDestroyingSomething(something)

def main():
    xyzzy = makeSomething()

    # main() has responsibility for xyzzy here but hands it off in next line

    killSomething (xyzzy)