0

我有以下代码可以正常工作,但我不确定是否需要删除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;
}
4

2 回答 2

4

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

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

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

于 2013-05-14T04:28:35.133 回答
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)
于 2013-05-14T04:31:22.583 回答