删除位置 (C++)

delete position (C++)

我有一个问题。阅读这部分代码:

int* res = NULL;
while((res = coda.Pop())!= NULL){
    std::cout << "Pop: " << *res << std::endl;
    delete res;
}

(其中 Pop() 是 class 中的函数,returns 是指向 int 的指针)

我问自己:起飞有什么区别

delete res;

来自while cicle,如下所示:

int* res = NULL;
while((res = coda.Pop())!= NULL){
    std::cout << "Pop: " << *res << std::endl;  
}
delete res;

程序编译,运行两种情况

你泄漏了所有的值。 None 的动态分配内存已释放。

在第二种情况下,你有内存泄漏,因为你没有删除任何东西。循环后的 delete 尝试删除空指针。

我的 C++ 很生锈,但第二部分看起来像是潜在的内存泄漏,具体取决于 coda.PopTesta() 弹出的内​​容。 鉴于它返回一个 int*,可以肯定地说 coda.PopTesta() 是使用 new 分配的。这意味着在第二种情况下,如果你的 coda.popTesta() 弹出多个值,除了最后一个值之外的所有值都不会被删除并导致内存泄漏。

更正:最后一个值也会泄漏。由于 while look 将终止一个 res 变为 NULL,而 delete on NULL 什么都不做。

coda 似乎是一个容器,Pop() 方法从其中删除单个分配的元素。由于此值之前是动态分配的(使用 new),因此应将其释放(使用 delete)以让 OS 内存管理器知道此内存是空闲的并且可以重复使用。
在第一种情况下,您正在释放从容器中弹出的所有变量。
第二个例子没有释放任何东西(它将删除标准定义的空指针但什么都不做)并且所有指针都丢失了。这称为内存泄漏。

虽然如果你在 coda 中有 0,第二个例子就可以正常工作,但这不是你想要依赖的东西。

coda 似乎是 stack 类型。堆栈似乎包含指向之前由 new.

分配的 int 的指针

因此,如果堆栈包含任意数量的元素,其中计数为 > 0,则在第二种情况下永远不会释放这些元素(最后一个也不会被释放)。因为循环运行只要 res != NULL.

在第一种情况下,通过调用coda.Pop()从堆栈中取出每个元素,输出并通过delete语句释放内存。

如果堆栈中指向 int 的指针仅用作引用(例如,弱指针,之前只是分配而不是由 new 显式分配)并且堆栈不是所有者在指针中,根本不应该有 delete