当一个c++对象被创建时,两件事会发生:
1)为对象分配内存
2)调用构造函数初始化那个内存
1.静态内存,栈,堆
静态内存:存储空间在程序开始前就可以分配,这个存储空间在程序运行的整个过程中都存在
栈:左括号到来时,存储单元在栈上创建,右括号时自动释放
堆:是自由存储单元,在运行时调用程序分配这些内存,内存的生存期由我们自己决定
2.c在堆上创建内存的方法
malloc()
free()
用malloc创建的是一块指定长度的内存而不是一个对象,所以返回值是(void*),而在c++中这种做法是危险的,c++不允许将(void*)赋予任何指针,所以必须映射,另外为对象创建内存后还必须不能忘记初始化。
3.c++中的new和delete
new:为对象分配内存(不必指定长度)并为这块内存调用构造函数
delete:调用析构函数,释放内存。当delete一个void指针时,唯一发生的事情是释放了内存,因为即没有类型信息也没有办法使得编译器知道要调用哪个析构函数
4.对数组的new和delete
分配整个数组的内存空间并且为每一个对象提调用构造函数
foo* fp = new foo[100];
delete fp;// 仅对首元素进行析构函数的调用
解决:delete[] fp;
5.重载new和delete
当我们考虑内存分配的效率或者在特殊的应用场合时,可以进行对new和delete的重载,当我们重载new时,改变的只是其中的内存分配部分,重载后的new的返回值是一个void*而不是指向特殊类型的指针,它所做的是分配内存而不是一个对象的建立--直到构造函数调用了才完成对象的创建(自动完成的)。
对象放置
重载运算符new还有两个不常见的用途
*在内存的指定位置放置一个对象,在嵌入式系统中,一个对象可能与一个特定的硬件是同义的
*在调用new时可以从不同的内存分配器中选择
这时重载的new可以带多个参数
X* xp=new(a) X;//其中a是传递的第二个参数
阅读(752) | 评论(0) | 转发(0) |