[英]Memory leak in assigning pointers
temp = p_long; 显示内存泄漏。 我不确定它是如何内存泄漏的。
long *temp = NULL;
for (int i = 1; i < 10; i++) {
if (i < 3) {
long *p_long = new long;
if ( p_long ) {
if ( 0 == *p_long ) {
flag = true;
} else if ( 1 == *p_long ) {
temp = p_long; -----> showing memory leak here
continue;
}
}
}
}
if (temp)
delete temp;
谢谢。
你没有释放堆分配long *p_long = new long;
考虑到它是一个for
循环,你将有一些孤立的内存块( new
编辑,但没有指针引用它们以便delete
-ion。)
如果未将p_long
分配给temp
则必须在循环的相应部分释放p_long
。 你的continue
声明是多余的(也许你的意思是break
?)。 此外, NULL
的现代版本是nullptr
。
另一点是你的if ( p_long )
检查基本上只是在你的当前new
类型分配器( long
)分配有问题(例如内存不足)的情况下才会变为NULL
,并且以下if ( 0 == *p_long )
检查新分配的long
是否自动初始化为0
。 AFAIK并非如此,因为在C ++中,您只需为所需内容付费。 该值未定义(实际上,它可能是该内存地址处的现有未阻尼值)。
long *temp = NULL;
for (int i = 1; i < 10; i++) {
if (i < 3) {
long *p_long = new long;
if ( p_long ) {
if ( 0 == *p_long ) {
flag = true;
} else if ( 1 == *p_long ) {
if(temp)
delete temp; -----> leaked memory freed here
temp = p_long;
continue;
}
}
}
}
第一次输入for
循环时, temp
为NULL
但在以后的迭代中,您将动态内存分配给指针。
long *p_long = new long;
在某些迭代中,您只需覆盖指针中包含的地址。 你忘记了使用new
分配的内存。 这并不意味着它会自动释放。 内存仍然被分配,只是你丢失了指向它的指针。
temp = p_long;
你需要像,
else if ( 1 == *p_long )
{
delete temp; -----> leaked memory freed here.
temp = p_long;
continue;
}
这将在为temp
分配新的已分配内存地址之前删除已分配的内存。
注意: 删除也可以安全地用于NULL
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.