假设我有一个指向MyClass的指针:
MyClass *myPointer = new MyClass();
delete myPointer;
和myPointer = NULL;
之间的区别是什么?
由于
答案 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会很有用,这样就可以检查它们是否仍然有效(取消引用一致的内存区域)。