为什么我的类字段在构造函数中被销毁

时间:2015-02-06 13:18:23

标签: c++ constructor attributes destructor

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

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

1 个答案:

答案 0 :(得分:4)

此代码:

t = T(100);

等同于:

T _temp(100);
t = _temp;

这有助于想象一些T被摧毁的原因。它不是您的t,而是临时T(100)。这就是为什么你会看到两个&#34;销毁&#34; ...一个用于临时,一个用于A::t

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

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