2015-02-06 2 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); 

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

'// если я не комментирую это я получаю Segfault при вызове добавить method' - это потому, что вы нарушили правило три/Правилу из пяти. Избегайте ручного управления памятью с помощью raw 'new' и' delete'. Вместо этого используйте 'std :: vector'. –

+0

Это упражнение, поэтому я не могу использовать вектор – Hunsu

+1

. Затем выполните конструктор копирования и оператор присваивания копий правильно. Утечка памяти - это ** не ** решение. – Angew

ответ

4

Этот код:

t = T(100); 

есть, что то же самое:

T _temp(100); 
t = _temp; 

который помогает визуализировать, почему некоторые T становится уничтожены. Это не ваш t, это временный T(100). Вот почему вы видите два отпечатка «Destroying» ... один для временного и один для A::t.

Чтобы избежать паразитного разрушения, используйте список инициализации:

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

Возможно, вы захотите поставить пару фигурных скобок вокруг «эквивалентной» формулировки, чтобы действительно подчеркнуть момент немедленного разрушения временного. – Angew

Смежные вопросы