这是否包含内存泄漏
Does this contain a memory leak?
下面的代码是否包含内存泄漏。我怀疑它确实存在,但我用来检测它们的工具(Visual Studio+Parasoft c++测试(并没有标记出任何东西。如果是这样,我该怎么修?
//A dynamically allocated array of char pointers
int numOfStrings = 10, numOfChars = 32;
char** data = new char*[numOfStrings];
//Generate each each individual string
for(int i = 0; i <numOfStrings; i++)
data[i] = new char[numOfChars];
//moves the elements 1-5 in the array to the right by one
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);
delete[] data;
编辑:
我应该提到的是,我已经尝试过如下对每个单独的字符串进行迭代,但出现了异常。
for(int i = 0; i< numOfStrings; i++)
delete [] data [i];
delete[] data;
您正在释放为数据分配的内存。然而,内存分配
data[i] = new char[numOfChars];
仍然没有被释放。
在删除数据之前,您必须迭代data
并删除每个data[i]
。
一般情况下,您应该确保拥有与new
一样多的delete
。
这里有numOfStrings + 1
new
,只有一个delete
还有一次泄漏
既然你在做
int index = 1, boundary = 5, sizeToMove = (boundary - index) * sizeof(numOfChars);
memmove(&data[index + 1],&data[index],sizeToMove);
(你没有像你想象的那样移动五个位置,而是移动四个位置(5 - 1 = 4)
(
此操作后
data[2] will get the value of data[1]
data[2] <- data[1]
data[3] <- data[2]
data[4] <- data[3]
data[5] <- data[4]
并且data[5]
所指出的内容将丢失data[2], data[1]
将具有相同的值(指向相同的位置(
这也可以解释为什么当您想通过迭代data
来删除时会出现segfault
规则是:对于每个"new",必须有一个相应的"delete"调用。你没有,所以你有一个漏洞。
是的,您有泄漏!
您必须先删除数组中的每个指针,然后再删除指向它们的指针。
//delete each array
for(int i = 0; i <numOfStrings; i++)
delete[] data[i];
//this is a single pointer, not an array
delete[] data;
现在您不会有泄漏
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存