您的位置:首页 > 其它

其他

2015-08-10 17:40 267 查看
free和delete一个指针

free(p)或delete(p)它们只是把指针所指的内存给释

放掉,但并不能把指针本身删除掉。之后一定要有p=NULL,不然p的指向是不确定的,会成为野指针。

你接下来通过if(p != NULL)来判断是不起作用的,即if语句对野指针是不起作用的。

int main()
{
char *p = (char*) malloc(100);
strcpy(p, "hello");
free(p);
p=NULL;

/*假设中间有很多代码*/

if(p!=NULL)
{
cout<<"p!=NULL"<<endl;
strcpy(p, "world");
cout<<p<<endl;
}

return 0;
}


动态内存会自动释放吗?

void Func(void)
{
char *p = (char *) malloc(100); // 动态内存会自动释放吗?
}
需要明确:

(1)指针消亡了,并不表示它所指的内存会被自动释放。

(2)内存被释放了,并不表示指针会消亡或者成了NULL 指针。

关于malloc/free 和 new/delete的区别

class Obj
{
public:
Obj(void)
{
cout<<"构造"<<endl;
}

~Obj(void)
{
cout<<"析构"<<endl;
}

void Initialize(void)
{
cout<<"Initialization"<<endl;

}

void Destroy(void)
{
cout<<"Destroy"<<endl;
}

};

int main()
{
Obj *a = (Obj*)malloc(sizeof(Obj));//不会自动执行构造函数
a->Initialize();
a->Destroy();
free(a);//不会自动执行析构函数

Obj *b = new Obj; //自动执行不带参数的构造函数(若没有就执行默认构造函数)
delete b; //自动执行析构函数(若没有就执行默认构造函数)
return 0;
}




这两个组合最好是配对使用.

当内存耗尽之后,malloc和new失败怎么办?如何判断?

1.判断指针是否为NULL,如果是则用return语句马上终止本函数.

void Fun(void)
{
A* a = new (A);
if(NULL==A)
{
return;
}
}


2.判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行.

void Fun(void)
{
A* a = new (A);
if(NULL==A)
{
cout<<"Memory Exhausted"<<endl;
exit(1);
}
}


new也能适应于构造函数的重载

class Obj
{
public:
Obj(void){cout<<"Obj(void)"<<endl; }
Obj(int x){cout<<"Obj(int x)"<<endl; }
};

int main(void)
{
Obj *a = new Obj;
Obj *b = new Obj(1);

delete a;
delete b;
}



必须养成“使用调试器逐步跟踪程序”的习惯,只有这样才能在出现问题时找到根本原因.

参考:高质量C/C++编程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: