为什么在分段错误中通过B类中的方法初始化A类的指针?

Dum*_*ior 1 c++ templates segmentation-fault

我有以下代码:( 住在Coliru)

#include <iostream>

class ClassA{
    public:
    ClassA(int i) : m_int(i){};

    int m_int;
};

class Master{
    public:
    Master(){};

    ~Master(){
        delete m_classMain;
    }

    ClassA* m_classMain;

    template<typename T>
    void mem(T* t, int i){
        t = new T(i);  
    }

    void test() {
        mem(m_classMain,3);
    }

    int get_i() const{
        return m_classMain->m_int;
    }
};

int main()
{
    Master* master = new Master();
    master->test();

    std::cout << master->get_i() << std::endl;
    delete master;
}
Run Code Online (Sandbox Code Playgroud)

我想ClassA* m_classMain通过mem(T* t, int i)模板方法初始化对象.

出于某种原因,我只会遇到分段错误.我认为t = new T(i)可能是这里的问题,但我无法理解为什么(不幸的是我手头没有调试器).

R S*_*ahu 5

在您发布的代码中,成员变量m_classMain未初始化.调用delete它是未定义行为的原因.

电话

    mem(m_classMain,3);
Run Code Online (Sandbox Code Playgroud)

m_classMain由于您按值传递它,因此不会初始化.要初始化它mem,您必须通过引用传递它.

template<typename T>
  void mem(T*& t, int i){ //T*& t, not T* t.
    t = new T(i);  
}
Run Code Online (Sandbox Code Playgroud)

作为良好的编码实践,请确保在构造函数中初始化所有成员变量.

Master() : m_classMain(nullptr) {};
Run Code Online (Sandbox Code Playgroud)