目录
一、C/C++内存分布
我们为了高效且方便的对内存空间进行管理,于是便有了内存空间的作用划分,让它们各司其职。
1、栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2、堆--用于程序运行时动态内存分配,堆是可以上增长的。
3、全局区/静态区--存储全局数据和静态数据
4、代码段--可执行的代码/只读常量
二、C语言中动态内存管理方式
C语言中申请内存的函数:malloc、cealloc和realloc。
C语言中释放内存的函数:free。
void Test ()
{
int* p1 = (int*)malloc(sizeof(int) * 4);
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
free(p1);
free(p3);
}
三、C++内存管理方式
C++中申请内存的函数:new和new[]。
C++中释放内存的函数:delete和delete[]。
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用
new[]和delete[]。(匹配起来使用)。
四、C语言和C++的不同
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。
class A
{
public:
A(int a = 0)
: _a(a)
{
cout << "A():" << this << endl;
}
~A()
{
cout << "~A():" << this << endl;
}
private:
int _a;
};
如上,我们写了一个类,当我们要用new开辟一块属于这个类的空间的时候,编译器会自动的帮我们调用它的构造函数,当它要销毁的时候编译器会自动的帮我们调用析构函数。
int main()
{
A* p1 = new A(10);
delete p1;
cout << endl;
A* p2 = new A[5];
delete[] p2;
return 0;
}
运行结果:在这里p1调用了1次构造函数和1次析构函数,但因为我们p2用了delete[5],所以编译器帮我们开辟了5次的内存空间。
注意:用new申请的内存就用delete释放,用new[]申请的内存就用delete[]释放。