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

allocate memory and before delete the allocation define NULL

本文关键字:分配 定义 NULL 内存 删除      更新时间:2023-10-16

我想问一下我是否正确:

MyClass *obj = new MyClass();//allocate memory
obj.Variab="HELLO";
obj=NULL;
delete obj; //free memory

分配给obj的内存在最后两句话之后被删除了吗?升值。谢谢我想提一下,我正在用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
}

it is ok?

不,你应该在赋值给NULL之前使用delete

delete obj; //free memory 
obj=NULL;

这是因为要删除的实际参数是已分配内存的地址,但是如果在使用delete之前分配NULL,则实际上是将NULL传递给delete,并且什么也不会发生,并且您将获得内存泄漏。


你的编辑问题:

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

EDIT to EDIT:

好吧,你仍然得到一个编译错误,因为obj没有定义当你试图delete它。试试这个:

#include <iostream>
#include <list>
using namespace std;
class MyClass {
public:
    string Variab;
};
void myfunction (const string& s) {
  cout << " " << s;
}
int main()
{
    int i=0;
    list<string>l;
    while (i<100) {
        MyClass *obj = new MyClass();//allocate memory
        obj->Variab="HELLO";
        l.push_back(obj->Variab);
        i=i+1;
        delete obj; //free memory
    }
    for_each (l.begin(), l.end(), myfunction);
}

这是不正确的:

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和智能指针

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

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

obj设置为null不会释放已分配的内存。内存不再分配给变量,但仍然保留,并导致内存泄漏。在空指针上调用delete不会产生任何影响。在释放内存之后,指针变得无效,最好将其分配给null。您需要切换最后两个语句的顺序:

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

您必须将delete new 返回的地址完全相同-因此您必须先将delete设置为空。

设置指针为null不影响分配-你只是覆盖存储在指针中的地址,不能再访问对象(这意味着你不能delete对象,让它泄露)。