2015-02-06 19 views
0

在我的構造函數中,我初始化一個字段。該字段在初始化後立即銷燬。 這裏是我的代碼和我的測試:爲什麼我的類字段在構造函數中被銷燬

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); 

ŧ的.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

'//如果我不評論這個我打電話添加method'時得到段錯誤 - 這是因爲你違反了三/規則的規則五。通過原生'new'和'delete'避免手動內存管理。改用'std :: vector'。 – 2015-02-06 13:23:51

+0

這是一個練習,所以我不能使用矢量 – Hunsu 2015-02-06 13:28:49

+1

然後實現一個複製構造函數並正確地複製賦值運算符。內存泄漏不是**解決方案。 – Angew 2015-02-06 13:30:31

回答

4

此代碼:

t = T(100); 

是等價的:

T _temp(100); 
t = _temp; 

這有助於想象爲什麼有些T是越來越摧毀。這不是你的t,而是臨時的T(100)。這就是爲什麼你看到兩個「毀滅」的打印......一個爲臨時,一個爲A::t

爲了避免虛假破壞,使用初始化列表:

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

你可能需要在「等效」表達式上加上一對大括號來真正強調臨時性破壞的重點。 – Angew 2015-02-06 13:29:04

相關問題