分配内存并在删除分配之前定义NULL

时间:2011-08-26 09:15:22

标签: c++ memory-management

我想问一下我是否更正了以下内容:

MyClass *obj = new MyClass();//allocate memory

obj.Variab="HELLO";

obj=NULL;
delete obj; //free memory

在最后两句话之后是否删除了为obj分配的内存? Appreciate.THX 我想提一下,我在c ++ / Ubuntu工作。 G ++是编译器

编辑:

如果我有什么?

int i=0;
list<string>l;
while (i<100)
{  
    MyClass *obj = new MyClass();//allocate memory
    obj->Variab="HELLO";
    //add the obj.valie in a list 
    l.push_back(obj);
    i=i+1;

delete obj; //free memory

}

没关系?

5 个答案:

答案 0 :(得分:4)

不,你应该在分配给NULL之前使用delete

delete obj; //free memory 
obj=NULL;

这是因为要删除的实际参数是已分配内存的地址,但如果在使用delete之前分配NULL,则实际上是将NULL传递给delete,并且不会发生任何事情,你会得到一个memory leak


您的编辑问题:

此代码无法编译,因为obj未在while范围之外定义,在任何情况下,l也是list<string>并且您正在尝试插入{{1}类型,这将导致另一个编译错误。此外,您应该使用MyClass*而不是obj->Variab,因为obj.Variab是指针。

编辑编辑:

好吧,您仍然遇到编译错误,因为在您尝试obj时未定义obj。试试这个:

delete

答案 1 :(得分:4)

这不正确:

obj = NULL; // don't do that! 
delete obj;

当您将NULL分配给obj时,您将失去之前包含的地址 泄露内存 。然后,当您delete obj时,您正在删除明确定义的NULL 什么都不做
正如其他人所说,

delete obj;
obj = NULL;

常用模式来做到这一点。

但是,我认为它是 反模式

  1. 每当您想要在删除其内容后将NULL指定给指针时,请问自己: 为什么此指针仍在范围内? 你确定还需要它吗? 一旦完成,只需让指针超出范围就好了。

  2. 每当你在做什么

    resource r = acquire();
    use(r);
    free(r);
    

    (内存/动态分配的对象是最常见的资源),警报应该响起。如果use(r)因例外而失败怎么办? 永远不要使用赤裸裸的指针。 更好地阅读 RAII and smart pointers

答案 2 :(得分:2)

这会泄漏,delete不会清除您使用new分配的内容。更改顺序:

delete obj;
obj = NULL;  // I would avoid this.

答案 3 :(得分:0)

obj设置为null不会释放您分配的内存。内存不再分配给变量,但仍保留,导致内存泄漏。在空指针上调用delete将不起作用。释放内存后,指针变为无效,最好将其指定给null。您需要切换最后两个语句的顺序:

delete obj; //free memory first
obj=NULL; //Set pointer to null for safety

答案 4 :(得分:0)

您必须delete new 返回的地址完全相同的地址 - 所以您必须先delete,然后设置为null。

将指针设置为null不会影响分配 - 您只需覆盖存储在指针中的地址,并且不能再访问该对象(这意味着您不能delete该对象并将其泄露)。