目录
一、C/C++内存分布
在C/C++中,程序中需要存储的数据可分为:局部数据、静态数据、全局数据、常量数据和动态申请数据,这些数据都有其独特的存储位置和生命周期。
1.局部数据:局部数据是在函数内声明的变量,在函数调用时被创建,函数返回时被销毁,存储在栈区
2.静态数据:静态数据使用static关键字声明,在整个程序生命周期存在,存储在静态区
3.全局数据:全局变量是在函数外部声明的变量,具有全局作用域和全局可见性,生命周期直到程序结束,存储在全局数据区
4.常量数据:常量数据是指在程序中使用字面值或使用 const 修饰符声明的变量,它们的值在程序执行期间保持不变。常量数据存储在只读数据区中,通常与全局数据存储在同一区域。
5.动态申请数据:动态申请数据是通过使用 new 运算符(C++)或 malloc() 函数(C)在堆内存中手动分配的数据。动态申请的数据需要通过 delete 运算符(C++)或 free() 函数(C)显式释放。

说明:
1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3.堆用于程序运行时动态内存分配,堆是可以上增长的
4.数据段--存储全局数据和静态数据
5.代码段--可执行的代码/只读常量。
二、C++内存管理
C++自己的动态内存管理操作符:new和delete
1.new和delete操作内置类型

2.new和delete操作自定义类型
C++自定义类型申请动态内存,需要有适当的构造函数和析构函数,以确保对象的正确创建和销毁。分配动态内存分配时,会先调用构造函数,释放时自动调用对象的析构函数。

三、定位new
定位new是C++的一种扩展形式,它允许在指定的内存地址上创建对象,而不是使用默认的动态内存分配机制。
语法:new (address) Type [initializer];
其中,address是指定的内存地址,Type是要创建的对象类型,initializer是可选的初始化参数。
使用定位new时,编译器不会分配新的内存,而是在指定的地址上构造对象。
class EG
{
public:
EG(int a = 0)
:_a(a)
{
cout << "EG(int a = 0)" << endl;
}
~EG()
{
cout << "~EG()" << endl;
}
private:
int _a;
};
int main()
{
EG* p1 = (EG*)malloc(sizeof(EG));
new(p1)EG; //如果类的构造函数有参数时,此处需要传参
p1->~EG(); //手动调用析构函数
free(p1);
EG* p2 = (EG*)operator new(sizeof(EG)); //分配内存
new(p2)EG(10); //指定地址创建对象
p2->~EG();
operator delete(p2);
}
文章详细阐述了C++中的内存分布,包括栈、静态、全局、常量和动态数据的存储位置及生命周期。接着讨论了C++的内存管理,特别是new和delete操作在处理内置类型和自定义类型时的角色,以及如何通过构造函数和析构函数确保对象的正确创建和销毁。最后介绍了定位new的概念,这是一种允许在特定内存地址创建对象的机制。

2万+

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



