关于C++指针初始化与new语法的两个技术疑问
问题解答
问题1:指针初始化与内存重复分配的疑问
- 先把指针初始化为
nullptr是良好的编程习惯:
哪怕当前代码里if-else已经覆盖了所有分支,指针肯定会被赋值,但提前初始化能防患于未然——如果后续改代码时新增了分支却忘了给指针赋值,未初始化的野指针会导致各种难以排查的未定义行为,用nullptr初始化是标准的防御性编程手段。 - 当前场景不存在重复分配内存的问题:
指针一开始是nullptr,没指向任何已分配的内存空间,后面if-else里每个分支只执行一次new,都是第一次给指针分配堆内存,没有在已有内存地址上重复分配的操作,自然不会出现重复分配或内存泄漏的问题。
问题2:new MyClass(MyClass::get("abc"))的语法说明
这种写法完全符合C++语法规则,核心是利用拷贝(或移动)构造函数初始化堆对象:
new T(参数)的语法中,括号里的参数只要能匹配T的任意构造函数就行,不是必须传入构造函数的“原始输入参数”(比如MyClass构造函数需要的string)。- 这里
MyClass::get("abc")返回一个MyClass临时对象,把它传给new MyClass(...)时,会调用MyClass的拷贝构造函数(如果没自己写,编译器会自动生成默认的拷贝构造),用这个临时对象来初始化堆上新创建的MyClass实例。 - 因为
MyClass的构造函数是protected的,外部不能直接调用,但static成员函数属于类本身,有权访问protected成员,所以MyClass::get能合法创建对象,进而作为参数用于堆对象的初始化。
内容的提问来源于stack exchange,提问作者user1008636
相关产品推荐
相关产品推荐

