为什么我的 class 字段在构造函数中被破坏

Why my class field is destroyed in constructor

在我的构造函数中,我初始化了一个字段。该字段在初始化后立即被销毁。 这是我的代码和测试:

A.hpp

class A {
    private:
        T t;

    public:
    A(); 
    ~A();

    void add(string name, string num);
}; 

A.cpp

A::A() {
    cout << "Creating A\n";
    t = T(100);
    cout << "End\n";
}

void A::add(string name, string num) {
    cout << "calling add in A\n";
    t.add(name, num);
}

T.hpp

class T {
    private:
        E * t;
    public:
        T(int size=100);
        ~T();
    void add(std::string name, std::string num);

T.cpp

T::T(int size) : size(size) {
    t = new E[size];
}

T::~T() {
    cout << "Destroying\n";
    // delete[] t; // if I don't comment this I get Segfault when calling add method
}


void T::add(string name, string num){
        E e = E(name, num);
        t[0] = e;
}

main.cpp

 int main(int argc, char* argv[]) {
    A a;
    a.add("name", "num");
}

输出

Creating A
Destroying
End
calling add in A
Destroying

此代码:

t = T(100);

相当于:

T _temp(100);
t = _temp;

这有助于想象为什么有些 T 会被摧毁。这不是你的t,而是临时的T(100)。这就是为什么您会看到两张 "Destroying"... 一张用于临时打印,另一张用于 A::t.

为避免虚假破坏,请使用初始化列表:

A::A() 
: t(100)
{ }