c++内存分配new、delete

2018-07-07 10:50:14

1.空指针使用delete是安全的。
2.动态联编--运行时分配内存,灵活性高,性能略差。
3.静态联编--编译时分配内存,灵活性差,性能高。

//运行时分配
int * age = new int;
delete age;  //释放
delete age;  //危险,结果无法预知

//指定位置
char * buffer = new char[1024];
pc1 = new (buffer) Box;             //从buffer处开始分配内存
pc2 = new (buffer+10) Box;          //buffer+10处开始
delete[] buffer                     //不会调用pc1的析构方法应该手动调用

int * age = malloc(4);
free(age);

int * psome = new int [10];
delete[] psome;

#给结构体分配内存
struct person * man = new person;

使用 new 分配的数组应该使用另一种方式释放。

char * buffer = new char[1024];

//不会调用pc1的析构方法应该手动调用
delete[] buffer

方括号告诉程序,应释放整个数组,而不仅仅是指针指向的元素。

总之,使用 new 和 delete 时,应遵守以下规则:

1.不要使用 delete 来释放不是 new 分配的内存。
2.不要使用 delete 释放同一个内存块两次。
3.如果使用 new[] 为数组分配内存,则应使用 delete[] 来释放。
4.如果使用 new 来分配内存,则应使用 delete(没有方括号)来释放。
5.对空指针应用 delete是安全的。

如果要从buffer里分配多个对象,必须自己手动偏移,由于对象内部实现为结构体,所以可以用sizeof来计算一个对象的大小。

Freecls *pc1, *pc2;

char * buffer = new char[1024];

#定位new运算符创建的对象
pc1 = new (buffer) Freecls;
pc3 = new (buffer + sizeof (Freecls)) Freecls("Better Idea", 6);

pc2 = new JustTesting("Heap1", 20);
//可以
delete pc2;

//不可以
delete pc1;
delete pc3;

//可以
delete [] pc1
//或
delete [] buffer

上面pc1,pc3不会调用析构函数,如果有需要,我们在释放 buffer 之前显式调用一次。

//最好反过来释放
//因为晚创建的对象可能依赖于早创建的对象
pc3->~Freecls();
pc1->~Freecls();

delete [] buffer;


总结:

c的基础语法请参考 c语言基础+核心


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。