gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:35 25 4
gpt4 key购买 nike

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

关于c++ - 为什么在段错误中通过 B 类中的方法初始化 A 类的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50845347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com