【问题标题】:Could this cause a memory leak, returning array from function?这会导致内存泄漏,从函数返回数组吗?
【发布时间】:2023-03-22 22:35:01
【问题描述】:

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

#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;
}

【问题讨论】:

  • 很可能是程序结束的时候,但无论如何你都应该这样做。真正的教训是使用std::vector 或其他东西。它会为你删除记忆。
  • "这很可能是程序结束的时候,但无论如何你都应该这样做。"你的意思是我需要删除它。
  • 是的,你应该这样做。当您反复索取资源而不归还资源时,这会发挥更大的作用。举个例子,当你的程序结束时,操作系统无法自行清理,一个半完成的数据库事务怎么样?

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


【解决方案1】:

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

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

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

【讨论】:

  • 你是说delete[] returned_array;
  • 是的,我的错。谢谢:)
【解决方案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)

【讨论】:

  • 不应该 killSomething 破坏 something 而不是创建另一个实例吗?
  • @Spook,是的,你是对的。该死的剪切粘贴 :-) 修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多