C++的动态内存分配
来源:互联网 发布:c语言define怎么用 编辑:程序博客网 时间:2024/05/20 06:52
与C
语言的malloc
, calloc
, realloc
和free
函数对应,C++
语言使用new
和delete
运算符实现动态内存分配和释放。
使用new运算符动态分配内存
new
运算符分配内存分为以下两类情境:一是为变量动态分配内存,而是为数组动态分配内存。其中为变量动态分配内存的一般形式为:
T* p = new T(...);
T
是任意类型名,赋值运算符右边的T
后可以跟括号,括号内是初始化该变量的值或该类的某一个构造函数的参数列表。程序执行到这里,在堆中动态分配出一块sizeof(T)
大小的内存空间,p
中存放着这段内存空间的起始地址。为数组动态分配内存的一般形式为:
T* p = new T[N];
T
是任意类型名,N
为数组元素的个数,可以是整型表达式。若T是类,则利用T
的默认构造函数进行初始化。程序执行到这里,在堆中动态分配一块N*sizeof(T)
大小的内存空间,p
中存放着这段内存空间的地址。
用delete
运算符释放动态分配的内存
用new
运算符分配的内存空间不会在程序离开其所发挥作用的程序块时自动释放内存空间,而只能在程序退出时才能得到释放。因此必须使用delete
运算符显式地释放动态分配的内存空间。对于为变量分配的内存空间,则直接使用delete p;
进行释放,而对于为数组分配的内存空间,则需要使用delete [] p;
进行释放。在程序中,要保证使用了一个new
运算符,就有且仅有一个delete
运算符与之对应。
小心:除了保证new和delete的成对出现,还要保证两者的形式相同,若用new ..[]为数组分配内存空间,必须用delete []释放该内存空间,若用new为变量分配内存空间,必须用delete释放该内存空间,否则会产生难以预料的结果。使用typedef将数组定义为其他名称大大增加了出现这种错误的可能,因此因避免这种情况。
/***************************************** * memory_alloc.cpp * * * * C++的动态内存分配 * *****************************************/#include <iostream>using namespace std;class A{private: int index; static int id;public: A() { index = id; cout<<"构造函数(id = "<<index<<")被调用"<<endl; id++; } ~A() { cout<<"析构函数(id = "<<index<<")被调用"<<endl; }};int A::id = 1;int main(){ int *p = new int; cout<<"*p = "<<*p<<endl; delete p; int *p1 = new int(10); cout<<"*p1 = "<<*p1<<endl; delete p1; A *p2 = new A; delete p2; A *p3 = new A[10]; delete [] p3; return 0;}
参考文献
- https://www.coursera.org/course/pkupop
- Scott Meyers著,侯捷译. Effective C++中文版. 电子工业出版社. 2012.
- C++/C动态内存分配的区别
- c 动态内存分配
- c动态内存分配
- C动态内存分配
- 【C++】动态内存分配
- C动态内存分配
- C动态内存分配
- C动态内存分配
- C---动态内存分配
- C语言的动态内存分配
- C和C++动态内存的分配
- C语言的动态内存分配函数
- C语言的动态内存分配
- 动态内存分配的C代码示例
- 动态内存的分配
- C语言动态内存分配
- C中的动态内存分配
- C++/CLI 动态内存分配
- Spring 配置文件报错 springmvc.xml
- 当虚函数遇到多继承
- Stereo Matching文献笔记之(七):《Spatial-Depth Super Resolution for Range Images》读后感~
- CSS 的4中定位方式
- 【Android-001】【快速入门】
- C++的动态内存分配
- BUILD问题“Class not found : Lorg/apache/commons/logging/Log”
- TLD(Tracking-Learning-Detection)学习与源码理解之(学习器)
- bzoj-2300 防线修建
- 网页时钟
- 《Python基础教程 (第2版 修订版)》 第2章 列表和元组(学习笔记· 一)
- POJ 2411 解题报告
- VLAN间通信之端到端模式
- VRF间的重分布