分配内存,并在删除分配之前定义NULL
allocate memory and before delete the allocation define NULL
我想问一下我是否正确:
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;
是通用模式。
然而,我认为它是一个反模式。每当你想在删除一个指针的内容后将
NULL
赋值给它时,问问你自己:为什么这个指针还在作用域中?你确定还需要它吗?
最好是让指针在完成操作后脱离作用域。无论何时
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
对象,让它泄露)。
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 自己的自定义向量类. 内存重新分配
- 在 for 循环中定义的临时数组,并分配给属于指针数组的指针
- 如何定义全局函数指针并分配给特定地址
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 动态分配自定义类的数组和重载运算符
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 为什么要对堆栈中的内存使用自定义动态内存分配?
- 自我分配变量的定义
- 如何将wchar_t字符串分配给用户定义类的 CString 成员
- 未定义 Lambda 复制分配运算符
- 如何使用boost ::与扩展STL容器的自定义容器分配
- 是否可以为 #define 分配定义的结果?
- 内存分配定义一个矩阵结构