在 resharper C++ 中检查 "Non-reclaimed resource acquisition"

Inspection "Non-reclaimed resource acquisition" in resharper C++

我使用 VS2015 和 ReSharper C++ 编写了一个 c++ 程序,我遇到了以下检查:

有人可以解释一下为什么这个检查会跳起来吗? 我相信这不是太关键的东西,但我还是很想知道。

这是相关的代码片段:

void allocate2DArr(char** arr, int rows, int cols)
{
    arr = new char *[rows];
    for (auto i = 0; i < rows; ++i)
    {
        arr[i] = new char[cols];
    }
}

谢谢

can someone please explain me why does this inspection jumps up?

因为你获得了(已分配)资源(特别是内存),所以你没有回收(deallocate)在一些(其实都是进入函数的)代码路径。

I believe that it is not something too critical, but I still would like to know.

在一定程度上取决于程序的类型。内存泄漏从来都不是一件好事,但它们在服务器和守护进程等长 运行 软件中肯定是至关重要的。

解决方案:总是delete[]new[]。更好的是:从不使用 new[],而是使用 std::vector

arr 未返回或声明有足够的间接性以通过引用传递。最终结果是当 arr 超出范围时分配丢失。

可是你说arr是一个指针?确实如此,但是您修改了指针本身,这需要通过引用传递指针才能对调用函数产生任何影响。归根结底,指针只是另一个变量。将其传递给函数,函数对本地副本进行操作。

在这种情况下,arr 是调用者传递的变量的副本。 arr和原点都指向同一个地方,但是一旦你arr = new char *[rows];arr指向不同的位置,原点是none更聪明。这就像将 int(比如 100)传递给函数一样。最初调用者和被调用者同意 100,但函数中发生的事情保留在函数中。

解决方案:通过引用传递。

void allocate2DArr(char** & arr, int rows, int cols)

备选方案 1:Return 创建的数组

char** allocate2DArr(int rows, int cols) 

备选方案 2:使用 std::vectorstd::unique_ptr 或围绕 char** 的智能包装器 class 来处理内存管理并仍然允许访问 char** 调用遗留接口时。