我有以下代码:(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)
可能是这里的问题,但我无法理解为什么(不幸的是我手头没有调试器)。
答案 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
参数。它在功能退出时被破坏。考虑通过引用传递,或直接从成员函数访问成员。