C++中指针先初始化为NULL是否必要?求栈与堆通俗解释
问题解答
一、先初始化指针为NULL再用new赋值是否必要?
完全没必要。直接写int* ptr1 = new int(28);就足够了——这行代码已经完成了指针的声明和初始化,把new分配的堆内存地址直接给到ptr1。
教程里先写int* ptr1 = NULL;再赋值,大概率是旧的编程习惯残留,或者是为了刻意演示“先声明指针、再分配内存”的分步流程,但在这个场景下属于多余操作。反而如果是在有分支逻辑的代码里(比如某些条件下才会执行new),提前把指针初始化为NULL能避免出现野指针,但像教程里这种连续赋值的情况,完全没必要多此一举。
二、通俗解释栈和堆的概念
可以把内存里的栈和堆想象成两种不同的储物空间:
栈:就像餐厅里的餐盘回收架——空间不大,但取用速度极快,而且是“后进先出”的规则(最后放上去的餐盘最先被拿走)。它由系统自动管理:你在函数里定义的局部变量、函数参数,都会被放到栈里,函数执行完,这些变量占用的空间会自动被系统回收,不用你操心。缺点是栈的总空间有限,不能放太大的东西。
堆:就像家里的储物间——空间很大,但找东西、放东西的速度比栈慢,而且需要你自己动手整理。堆里的内存需要你手动用
new(C++)这类指令去申请,用完之后也得手动用delete释放,不然会占着空间不放(内存泄漏)。适合存放那些需要长期存在、或者体积比较大的数据。
内容的提问来源于stack exchange,提问作者Kolbeinn Hrafn Antonsson
相关产品推荐
相关产品推荐

