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;
感谢。
答案 0 :(得分:2)
你没有释放堆分配long *p_long = new long;
考虑到它是一个for
循环,你将有一些孤立的内存块(new
ed,但没有引用它们的指针delete
- 离子。)
如果未将p_long
分配给temp
,则必须在循环的相应部分释放continue
。您的break
语句是多余的(也许您的意思是NULL
?)。此外,现代版nullptr
为if ( p_long )
。
另一点是,如果您当前NULL
该类型的new
堆分配器(long
)出现问题,那么if ( 0 == *p_long )
检查基本上只会是long
分配(例如,内存不足),并且以下0
正在检查新分配的{{1}}是否已使用值{{1}}自动初始化。 AFAIK并非如此,因为在C ++中,您只需为所需内容付费。该值未定义(实际上,它可能是该内存地址处的现有未被篡改的值)。
答案 1 :(得分:0)
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;
}
}
}
}
答案 2 :(得分:0)
第一次输入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
之前,这将删除已分配的内存。