在C++中,内存分为以下5类:
栈内存
存储局部变量和函数调用信息,自动分配和释放。其生命周期随着函数调用和返回而自动分配和释放。
void function() {
int localVar = 5; // 在栈内存
}
这部分内容在下面的文章中详细讲过:
此外这里有很不错的学习视频:
堆内存
用于动态分配内存,程序员需要手动管理(分配和释放)。在程序运行时分配,直到显式释放(使用delete或free)。访问速度相对较慢,因需要管理内存碎片。
int* ptr = new int(10); // 在堆内存详细讲解:
学习视频:
全局内存
用于存储全局变量和静态变量。程序运行期间存在,直到程序结束。例如static 保存的变量。
int globalVar = 20; // 在全局内存
static int staticVar = 40; // 在全局内存
int main()
{
return 0;
}常量内存
存储常量值,如字符串字面量和常量变量。在程序运行期间存在,通常在编译时分配。
const int constVar = 30; // 在常量内存代码段
存储程序的可执行代码。在程序运行期间存在,直到程序结束。
特殊情况
指向堆内存的局部指针
void function() {
int* ptr = new int(10); // 在堆内存
// ...
delete ptr; // 必须手动释放
}
ptr在栈内存,指向的整数在堆内存。
全局常量与局部常量
const int globalConst = 100; // 全局常量
void function() {
const int localConst = 200; // 局部常量
}全局常量在常量内存,局部常量在栈内存。全局常量的生命周期是整个程序运行期间,而局部常量的生命周期仅在其作用域内。
静态局部变量
void function() {
static int staticLocalVar = 0; // 在全局内存
staticLocalVar++;
}
静态局部变量在全局内存。静态局部变量在函数调用之间保持其值,即使函数结束后也不会被销毁。
内存对齐
struct AlignedStruct {
char a;
int b; // 可能会因为对齐要求而在内存中有填充
};
结构体在堆或栈中分配,可能会有额外的填充字节。
容器
void function() {
std::string str = "Hello"; // 在栈内存
}std::string内部可能会使用堆内存来存储字符串内容,但str本身在栈上。
虚函数表和虚函数指针
虚函数表通常存储在程序的全局内存区域。每个包含虚函数的类都有一个对应的虚函数表,表中存储着指向该类虚函数实现的指针。
每个对象实例(即类的实例)会有一个指向其对应虚函数表的指针,通常称为虚指针(vptr)。这个指针存储在对象的内存中,通常位于对象的起始部分。
评论区