在 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::vector
、std::unique_ptr
或围绕 char**
的智能包装器 class 来处理内存管理并仍然允许访问 char**
调用遗留接口时。
我使用 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::vector
、std::unique_ptr
或围绕 char**
的智能包装器 class 来处理内存管理并仍然允许访问 char**
调用遗留接口时。