gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:33:07 25 4
gpt4 key购买 nike

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

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

这是相关的代码片段:

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

谢谢

最佳答案

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

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

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

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

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

方案一:返回创建的数组

char** allocate2DArr(int rows, int cols) 

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

关于c++ - 在 resharper C++ 中检查 "Non-reclaimed resource acquisition",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43673994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com