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

如何正确初始化指向其他类的类成员指针?规避崩溃与内存泄漏

解决空指针段错误+内存安全的最佳实践方案

问题根源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:18:09