You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中普通指针声明与new动态分配对象指针的区别是什么

C++ 两种指针写法的区别

以下针对两种写法的差异分点说明:

  • 初始化状态不同
    仅声明的写法 MyClass *myObject; 只定义了一个指向MyClass类型的指针变量,没有做任何初始化:如果是作用域内的局部变量,指针会是随机值的野指针,指向不确定的内存地址,直接解引用访问会触发未定义行为;如果是全局作用域的变量,会被默认初始化为空指针。
    带new初始化的写法 MyClass *myObject = new MyClass(); 会把指针初始化为合法的内存地址,不存在野指针问题(除非堆内存申请失败抛出异常)。
  • 内存分配与对象构造逻辑不同
    仅声明的写法不会申请任何存放MyClass实例的内存,也不会触发类的构造函数。
    带new的写法会依次完成三个操作:在堆内存上申请一块大小匹配MyClass实例的内存空间、调用MyClass的无参构造函数在这块内存上实例化对象、将实例的堆内存地址赋值给指针变量。
  • 内存释放要求不同
    仅声明的指针本身的生命周期和所属作用域绑定,没有关联额外的堆内存,不需要手动释放,只要避免访问野指针即可。
    带new初始化的指针指向的堆对象不受作用域生命周期限制,使用完毕后必须手动调用delete myObject释放对应的堆内存,否则会造成内存泄漏。

额外注意:如果两行代码写在同一作用域下,属于重复定义同名变量myObject,会直接触发编译报错。

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:39:01