我想问一下我是否更正了以下内容:
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
}
没关系?
答案 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;
是常用模式来做到这一点。
但是,我认为它是 反模式 。
每当您想要在删除其内容后将NULL
指定给指针时,请问自己: 为什么此指针仍在范围内? 你确定还需要它吗?
一旦完成,只需让指针超出范围就好了。
每当你在做什么
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
该对象并将其泄露)。