如何正确初始化指向其他类的类成员指针?规避崩溃与内存泄漏
解决空指针段错误+内存安全的最佳实践方案
问题根源
foo类的成员指针m_b初始化为NULL,调用m_b->barBase_print(6)时访问空指针,触发SIGSEGV段错误。要解决这个问题,核心是让m_b指向一个有效bar对象,同时保证内存不泄漏,且barBase的m_k能初始化为1。
最佳实践:使用智能指针(推荐)
用C++标准库的智能指针(比如std::unique_ptr)自动管理内存,无需手动new/delete,从根源避免内存泄漏。同时bar对象构造时,barBase的m_k会自动初始化为1,满足需求。
修改后的代码示例
class_foo.hpp
#ifndef TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP #define TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP #include <memory> // 引入智能指针头文件 // 前向声明 namespace class_bar { namespace class_bar_2 { class bar; } } using namespace class_bar::class_bar_2; namespace class_foo { class foo { public: // 构造函数初始化智能指针,创建bar对象 foo() : m_b(std::make_unique<bar>()) {} void foo_print_from_bar(); private: // 用std::unique_ptr替代裸指针 std::unique_ptr<bar> m_b; }; } #endif //TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP
class_foo.cpp(无需修改)
#include "../include/class_foo.hpp" #include "../include/class_bar.hpp" #include <iostream> namespace class_foo { void foo::foo_print_from_bar() { std::cout << "foo print using "; m_b->barBase_print(6); // 现在m_b指向有效对象,可安全调用 } }
main.cpp(无需修改)
#include <iostream> #include "include/class_foo.hpp" #include "include/class_bar.hpp" int main() { class_foo::foo f; f.foo_print_from_bar(); // 正常执行,输出预期结果 std::cout << "Hello, World!" << std::endl; return 0; }
class_bar.hpp、class_bar.cpp保持不变,因为barBase的m_k已经默认初始化为1,无需额外修改。
备选方案:手动管理裸指针(不推荐)
如果必须使用裸指针,需要在构造函数中创建对象,析构函数中释放,同时禁用拷贝构造和赋值运算符(防止浅拷贝导致重复释放内存):
修改后的class_foo.hpp
#ifndef TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP #define TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP // 前向声明 namespace class_bar { namespace class_bar_2 { class bar; } } using namespace class_bar::class_bar_2; namespace class_foo { class foo { public: foo() : m_b(new bar()) {} // 构造时创建bar对象 ~foo() { delete m_b; } // 析构时释放内存 // 禁用拷贝构造和赋值运算符,避免浅拷贝问题 foo(const foo&) = delete; foo& operator=(const foo&) = delete; void foo_print_from_bar(); private: bar* m_b; }; } #endif //TWOCLASSUSEEACHOTHER_CLASS_FOO_HPP
运行效果验证
两种方案运行后都会输出:
foo print using barBase printing m_k = 7 Hello, World!
完全符合预期,且不会出现内存泄漏或段错误。
内容的提问来源于stack exchange,提问作者Nick X Tsui
相关产品推荐
相关产品推荐

