我有一个for
循环,我使用指针动态设置对象。我想为下一个实例重用相同的指针,但我担心存在内存泄漏。
myPointer *obj;
for (int i = 0; i <= 10; i++) {
obj = new Object(i);
obj->doSomeStuff();
}
我应该在NULL
声明的末尾将obj设置为for
吗? delete obj
在这种情况下似乎只会引起严重问题。
编辑:我在类中添加了一个重置方法,以重置私有变量的值,以便进行另一次传递。似乎工作得更好/更快。
答案 0 :(得分:5)
new
您需要delete
的任何内容,否则您将泄露它。
Object* obj;
for (int i = 0; i <= 10; i++) {
obj = new Object(i);
obj->doSomeStuff();
delete obj;
}
否则,只要下一次迭代到来,您new
另一个Object
,将其分配给obj
指针,之前的对象现在已泄露。
在这种情况下,如果您不想担心自己管理内存,则甚至不需要指针。
for (int i = 0; i <= 10; i++) {
Object obj {i};
obj.doSomeStuff();
} // Now obj will fall out of scope and be automatically cleaned up.
答案 1 :(得分:2)
将指针设置为NULL
可确保内存泄漏,因为现在无法delete
所有涂层对象。如果delete obj
导致问题,那么您需要解决这些问题,否则您将遇到内存泄漏。 (除非对象以某种方式删除自己。)
答案 2 :(得分:1)
要添加,new Object(i);
会在堆上创建一个新的未命名的 Object
,这是您作为程序员受托的内存空间管理。
使用obj = new Object(i);
,您通过在内存中记录位置(即其地址)在指针obj
中为对象保留句柄 ,这是指针存储的内容。
然后代码进入第二个循环,覆盖 obj
中记录的位置new Object(i)
。
现在你已经失去了第一个Object
的位置。由于你不知道它在哪里,你不可能清理它,这会导致内存泄漏。
在Cyber的例子中,只需在堆栈上创建,就可以避免所有这些带有堆的混乱内容。 堆栈是为您管理的内存。您可以阅读更多相关信息here
现在,如果你坚持使用指针并在堆上进行分配,你需要学会自己清理,就像这里的其他人一样。
Cyber再次提到的这个想法是,对于你拥有的每个delete
都有一个new
。要delete
某些东西,你需要它的位置,这就是为什么你需要一个指针来记住它的位置,直到它被删除。
您还需要正确的类型,这样我们才能知道我们应该有多大的内存 delete
。请注意,您的指针与您尝试删除的对象具有不同的类型。
另外,请不要误以为指针只适用于堆。它们也可以处理堆栈上的对象。
Object obj(10);
Object obj2(20);
Object* pointer_to_obj = &obj; //address of obj
pointer_to_obj = &obj2; //Now store the address of obj2
我希望我能帮到你。
P.S。将obj
(一个指针)设置为NULL
或nullptr
(C ++ 11)基本上意味着指针不存储任何对象的位置。
答案 3 :(得分:0)
在这种情况下,实际上正确的做法是删除指针,否则最终会导致内存泄漏。
myPointer *obj;
for (int i = 0; i <= 10; i++) {
obj = new Object(i);
obj->doSomeStuff();
delete obj;
}