删除[]和内存泄漏

时间:2009-08-13 02:59:49

标签: c++ visual-c++ memory-management memory-leaks

我想知道C ++中的delete []运算符。 (我使用的是Visual Studio 2005)。

我有一个托管DLL调用的非托管DLL。当我在调试时执行一些任务后关闭这个程序时,我得到了很多(数千?)的内存泄漏,大多数是24个字节 - 大小为44个字节。我怀疑这可能是由于我有一个非托管的DLL。

无论如何,根据我的理解,如果我有以下代码:

char* pointer = new char[500]
/* some operations... */
delete[] pointer;

然后它的所有内存都被正确释放了,我是对的吗?

当我有以下代码时会发生什么:

char* pointer = new char[500];
char* pointerIt = pointer;
/* some code perhaps to iterate over the whole memory block, like so */
for (int i = 0; i < 250; i++){ // only iterate halfway
    *pointerIt = 0;
    pointerIt++;
}

delete[] pointer;

指针指向的内存被删除了吗?所以这意味着pointerIt现在没有指向有效的内存..但是没关系,因为我可以将两个指针都设置为NULL,对吗?

无论如何,如果我这样做,现在会发生什么:

char* pointerFirstPosition = new char[500];
char* pointerIt = pointerFirstPosition;

for (int i = 0; i < 250; i++){ // only iterate halfway
    *pointerIt = 0;
    pointerIt++;
}

delete[] pointerIt; // delete the pointer iterator...

此代码是否会将pointerIt指向的内存块删除到pointerIt +500?还是会将pointerFirstPos指向的内存块删除到pointerFirstPos +500?

这会导致内存泄漏吗?

对于长篇大论的消息感到抱歉,我正试着清楚地传达我的信息。

谢谢,

的Kreb

2 个答案:

答案 0 :(得分:4)

第一个问题集:

char* pointer = new char[500] 
/* some operations... */ 
delete[] pointer;
     

然后释放所有内存   对,我是对的吗?

右。

第二个问题集:

char* pointer = new char[500];
char* pointerIt = pointer;
/* some code perhaps to iterate over the whole memory block, like so */
for (int i = 0; i < 250; i++){ // only iterate halfway
    *pointerIt = 0;
    pointerIt++;
}

delete[] pointer;
     

指针指向的内存是   删除了吗?所以这意味着   pointerIt现在没有指向有效   记忆..但那是可以的,因为我可以   将两个指针都设置为NULL,对吧?

内存pointer拥有一个完全删除的地址是。 pointerpointerIt都拥有无效内存的地址。每个指针只是一个变量,每个变量都是独立的。所以两者都存储着彼此独立的地址。取消引用运算符*将简单地为您提供该地址的变量。该地址的变量是一个与指针变量不同的变量。

第三个问题集:

您应该只删除已分配的地址,整个数组。如果您尝试删除部分数组,则会有未定义的结果。它会导致内存泄漏吗?可能,它会导致崩溃吗?可能,它会导致....?可能。

所以只删除你分配的内容。如果您分配了一个数组,那么如果您删除的类型不是您使用delete[]删除的数组,则会使用delete删除。

以下是为了清晰起见而做的事情的例子:

char* pointer = new char[500];
char* pointerIt = pointer;
//This is fine because you are deleting the same address:
delete[] pointerIt;
//The memory that both variables point to is freed, do not try to free again

答案 1 :(得分:0)

查看boost :: shared_ptr或boost :: scoped_ptr,再也不用担心这个问题了。 这给你一个静态&amp;引用计算管理记忆的方式。

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm