C++中普通指针声明与new动态分配对象指针的区别是什么
C++ 两种指针写法的区别
以下针对两种写法的差异分点说明:
- 初始化状态不同
仅声明的写法MyClass *myObject;只定义了一个指向MyClass类型的指针变量,没有做任何初始化:如果是作用域内的局部变量,指针会是随机值的野指针,指向不确定的内存地址,直接解引用访问会触发未定义行为;如果是全局作用域的变量,会被默认初始化为空指针。
带new初始化的写法MyClass *myObject = new MyClass();会把指针初始化为合法的内存地址,不存在野指针问题(除非堆内存申请失败抛出异常)。 - 内存分配与对象构造逻辑不同
仅声明的写法不会申请任何存放MyClass实例的内存,也不会触发类的构造函数。
带new的写法会依次完成三个操作:在堆内存上申请一块大小匹配MyClass实例的内存空间、调用MyClass的无参构造函数在这块内存上实例化对象、将实例的堆内存地址赋值给指针变量。 - 内存释放要求不同
仅声明的指针本身的生命周期和所属作用域绑定,没有关联额外的堆内存,不需要手动释放,只要避免访问野指针即可。
带new初始化的指针指向的堆对象不受作用域生命周期限制,使用完毕后必须手动调用delete myObject释放对应的堆内存,否则会造成内存泄漏。
额外注意:如果两行代码写在同一作用域下,属于重复定义同名变量
myObject,会直接触发编译报错。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

