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

时间:2018-06-13 20:03:11

标签: c++ templates segmentation-fault

我有以下代码:(live on 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;
}

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

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

2 个答案:

答案 0 :(得分:5)

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

电话

    mem(m_classMain,3);

不会初始化m_classMain,因为您按值传递它。要在mem中初始化它,您必须通过引用传递它。

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

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

Master() : m_classMain(nullptr) {};

答案 1 :(得分:3)

您正在按值传递mem()函数的t参数。它在功能退出时被破坏。考虑通过引用传递,或直接从成员函数访问成员。