C/C++内存分布
栈,堆,全局区,常量区,代码区
- 栈, 又叫堆栈,系统自动分配的空间,只要不特殊声明,就定义在栈区,比如非静态局部变量,函数参数,返回值等等,函数的区域也在栈上,栈是向下增长的。
- 使用动态内存分配的方式可以申请堆空间,使用完要记得手动释放
- 全局区:静态变量(static),全局变量
- 常量区:代码区中的数字,字符等常量,例如 ‘a’, -1.2等
- 代码区:存放可执行的代码,避免频繁的读硬盘
C语言中动态内存管理方式
malloc/calloc/realloc和free 是C语言中stdlib.h中提供的函数
void * malloc(size_t, size_t);
void * calloc(size_t, size_t);
malloc不会进行初始化,calloc会初始化空间为0,所以在追求效率的时候,使用malloc较优。
void realloc(void * p, size_t size);
realloc 的用法是申请size个字节的空间, 将指针p所指向空间中的数据拷贝到刚申请的空间当中,释放p,返回刚申请到的空间的首地址
void * free(void *);
记得手动释放动态开辟的内存
C++内存管理方式
C语言内存管理方式在C++中可以继续使用,但是在某些特定的地方使用起来就会比较麻烦。
也就是通过new和delete操作符进行动态内存管理,注意它们是运算符
比如通过动态内存分配实例化对象d的时候,new/delete会自动调用构造/析构函数,而malloc/free不会。
因此C++提出了自己的内存管理方式,当我们在给类分配空间的时候,最好使用new/delete
new/delete的简单操作
int main()
{
//动态申请一个int类型的空间
int * ptr = new int;
//动态申请一个int类型的空间并初始化为10
int * ptr1 = new int(10);
//动态申请3个int类型的空间
int * ptr2 = new int[3];
delete ptr;
delete ptr1;
delete[] ptr2;
system("pause");
return 0;
}
注意:申请和释放单个元素的空间,使用new/delete操作符,申请和释放连续的空间,使用new[]和delete[]
对于自定义类型的new/delete操作
class Test
{
int m_data;
public:
Test() :
m_data(0)
{
cout << "Test():" << this << endl;
}
~Test()
{
cout << "~Test():" << this << endl;
}
};
void test1()
{
//申请单个Test类型的空间
Test * pt = (Test *)malloc(sizeof(Test));
free(pt);
//申请10个Test类型的空间
Test * pt1 = (Test *)malloc(sizeof(Test)* 10);
free(pt1);
}
void test2()
{
//申请单个Test类型的空间
Test * p1 = new Test;
delete p1;
//申请10个Test类型的空间
Test * p2 = new Test[10];
delete[] p2;
}
int main()
{
//test1();
test2();
system("pause");
return 0;
}
注意: 从上面的代码我们可以看出, 在申请自定义类型的空间时, new会调用构造函数, delete会调用析构函数, 而malloc和free不会
本文详细解析了C/C++中的内存分布,包括栈、堆、全局区、常量区和代码区的功能与特性。深入探讨了C语言中动态内存管理函数如malloc、calloc、realloc和free的使用,以及C++特有的new/delete操作符如何更高效地管理内存,特别是自定义类型的对象。
341

被折叠的 条评论
为什么被折叠?



