删除指针和将指针设置为NULL有什么区别?

时间:2016-11-30 13:28:59

标签: c++ qt pointers

假设我有一个指向MyClass的指针:

MyClass *myPointer = new MyClass();

delete myPointer;myPointer = NULL;之间的区别是什么?

由于

3 个答案:

答案 0 :(得分:8)

delete myPointer取消分配内存,但保留myPointer变量的值,表示它指向一些垃圾地址。

myPointer = NULL只将myPointer的值设置为空指针,可能会泄漏内存,如果你不删除其他指针,它指向与myPointer相同的地址

在理想世界中,你应该使用这两个字符串,如下所示:

delete myPointer; // free memory
myPointer = nullptr; // setting value to zero, signalizing, that this is empty pointer

但总的来说,使用std::unique_ptr,这是一种现代的内存管理方法。

答案 1 :(得分:2)

delete myPointer释放分配的空间,但允许您使用悬空指针(指向未分配的内容)。

myPointer = NULL将指针设置为一个值,该值用于表示(指向任何内容)的概念,但为您提供内存泄漏,因为您没有解除分配现在失去的记忆"。如果您不滥用内存泄漏可能不会太有害,但始终被视为一种编程错误。

您可以使用以下习语来防止将来出现问题:

delete myPointer;
myPointer = NULL;

答案 2 :(得分:1)

简而言之,delete用于为先前使用 new 关键字分配的对象释放内存。在释放对象的内存之前调用对象的析构函数(如果对象具有析构函数)。

取消引用解除分配的内存(通常)的指针在调用delete后没有NULL值,但对它们的任何操作都会导致错误。

将指针设置为NULL意味着它不会取消引用任何内容,但为对象分配的内存仍然存在。

在删除取消引用的对象后,有时将指针设置为NULL会很有用,这样就可以检查它们是否仍然有效(取消引用一致的内存区域)。