2009-08-13 103 views
3

我在想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; 

内存指针指向被删除吗?所以这意味着指针现在不是指向有效的内存..但没关系,因为我可以将两个指针设置为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的内存块吗?

这可能导致内存泄漏?

对不起,我试图让我的信息清晰。

感谢,

克雷布斯

+1

“但没关系,因为我可以设置两个指针为NULL,对吧?”那么,你应该完成这些指针...... – GManNickG 2009-08-13 03:03:23

回答

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; 

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

内存pointer拥有一个地址被完全删除是的。 pointerpointerIt都包含无效内存的地址。每个指针只是一个变量,每个变量都是独立的。所以两个存储彼此独立的地址。解引用运算符*将简单地给你在该地址的变量。该地址处的变量是与指针变量不同的变量。

第三个问题集:

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

所以只能删除你分配的东西。如果你分配一个数组,那么如果你删除了一个非你使用delete删除的数组的类型,则用delete[]删除。

这里是东西的eample是罚款只是为了清晰:

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 
+2

除了使用'new'或'new []'创建的东西外,它没有定义为delete或者delete []'。 – GManNickG 2009-08-13 03:06:18

+0

谢谢,那是我怀疑的。但是说,例如在第三个问题集中,我设置pointerIt = pointerFirstPosition,然后删除[] pointerIt,这仍然是未定义的?我正在与别人的旧代码工作,他已经离开了公司,我试图找出是否这是内存泄漏的原因。 – krebstar 2009-08-13 03:12:50

+0

只是为了踢我测试了这在g ++ 4.4.1 - 基本上和你在第三个代码示例中获得的代码相同,只是'pointerIt'在数组中移动了一半。在'pointerIt'上调用'delete []'会使'pointer'失效,但是如果行为未定义,那么显然这种行为不能期望来自每个编译器。 – 2009-08-13 03:14:50

0

退房的boost :: shared_ptr的或升压:: scoped_ptr的,从此再也不用担心这一点。 这给你一个静态的&引用计数的方式来管理你的记忆。

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

+1

如果我这样做,我将不得不修改这么多的项目.. :(我的经理无法证明的东西 – krebstar 2009-08-13 03:22:15

+0

对于未来的代码,然后使用'std :: vector'和kin。没有手动内存分配* * ever **。 – GManNickG 2009-08-13 03:24:03

+0

好的,谢谢你们,非常有帮助:) – krebstar 2009-08-13 03:25:08