我有以下代码:(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;
}
我想通过 mem(T* t, int i)
方法初始化对象 ClassA* m_classMain
,这是一个模板方法。
出于某种原因,我只得到一个段错误。我认为 t = new T(i)
可能是这里的问题,但我不明白为什么(不幸的是我手头没有调试器)。
在您发布的代码中,成员变量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) {};
我是一名优秀的程序员,十分优秀!