删除位置 (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
。
我有一个问题。阅读这部分代码:
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
。