为什么new分配在堆上,函数变量在栈上+递归调用时栈内存的变化过程

在 C++ 里,new 运算符分配的内存位于堆上,而函数的局部变量存于栈上,这是由它们各自的特性和设计目的决定的,下面为你详细解释:

new 分配在堆上的原因

1. 动态内存分配需求

程序运行时,有些时候需要根据实际情况来决定所需内存的大小,编译时无法确定具体的内存量。堆内存能很好地满足这种动态分配的需求,new 运算符可在运行时按需分配内存。

示例场景:编写一个图像处理程序,需要根据用户选择的图像分辨率来分配内存。由于不同用户选择的分辨率不同,所需内存大小也不同,此时就可以使用 new 在堆上动态分配内存。

#include <iostream>
int main() {
    int width, height;
    std::cout << "请输入图像的宽度和高度:";
    std::cin >> width >> height;
    // 在堆上动态分配二维数组
    int** image = new int*[height];
    for (int i = 0; i < height; ++i) {
        image[i] = new int[width];
    }
    // 使用完后释放内存
    for (int i = 0; i < height; ++i) {
        delete[] image[i];
    }
    delete[] image;
    return 0;
}

在这个例子中,图像的宽度和高度在运行时由用户输入决定,通过 new 运算符在堆上动态分配了二维数组的内存。

2. 生命周期管理的灵活性

堆内存的生命周期由程序员手动控制,对象的生命周期可以跨越函数调用。这对于需要在多个函数间共享对象或者对象需要长期存在的场景非常有用。

示例场景:在一个游戏程序中,需要创建一个全局的游戏角色对象,该对象在整个游戏运行期间都需要存在。可以使用 new 在堆上创建该对象,确保其生命周期足够长。

#include <iostream>
class GameCharacter {
public:
    GameCharacter() { std::cout << "游戏角色创建" << std::endl; }
    ~GameCharacter() { std::cout << "游戏角色销毁" << std::endl; }
};
GameCharacter* createCh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

potato_potato_123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值