删除指向的对象

时间:2014-10-15 16:41:56

标签: c++ memory-leaks iteration

我有一个for循环,我使用指针动态设置对象。我想为下一个实例重用相同的指针,但我担心存在内存泄漏。

myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
}

我应该在NULL声明的末尾将obj设置为for吗? delete obj在这种情况下似乎只会引起严重问题。

编辑:我在类中添加了一个重置​​方法,以重置私有变量的值,以便进行另一次传递。似乎工作得更好/更快。

4 个答案:

答案 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(一个指针)设置为NULLnullptr(C ++ 11)基本上意味着指针不存储任何对象的位置。

答案 3 :(得分:0)

在这种情况下,实际上正确的做法是删除指针,否则最终会导致内存泄漏。

myPointer *obj;
for (int i = 0; i <= 10; i++) {
    obj = new Object(i);
    obj->doSomeStuff();
    delete obj;
}