2014-09-11 1 views
0
#ifndef PERSON_H 
#define PERSON_H 

#include <string> 
using namespace std; 
class Person 
{ 
public: 
    Person() 
    { 
     numberOfchildren = 0; 
     children = new string[20]; 
    } 
    void addAChild(string name) 
    { 
     children[numberOfchildren++] = name; 
    } 
    string *getChildren() 
    { 
     return children; 
    } 
    int getNumberOfChildren() 
    { 
     return numberOfchildren; 
    } 
private: 
    string *children; 
    int numberOfchildren; 
}; 
#endif 
+0

Код как опубликованный - это определение класса. Это не требует деструктора, поэтому основное утверждение в вопросе неверно. Опубликуйте полный, но минимальный пример, демонстрирующий проблему, и не забудьте описать проблему. –

+0

Это «требует» деструктора в том смысле, что в противном случае вы будете утечки памяти. Однако нет необходимости в 'new', если вы просто выделяете массив фиксированного размера. 'string children [20];' достаточно. –

+1

Или, так как вы даже не проверяете наличие вне пределов, возможно, 'std :: vector ' поэтому он может расти по мере необходимости (также не нужно использовать 'new') – crashmstr

ответ

1

Класс требует деструктора, потому что он выделяет массив строк в куче в конструкторе.

Если класс выходит из области действия без удаления этого массива строк, у вас будет утечка памяти.

Редактировать: вы должны использовать вместо этого std::vector. Просто позвоните vector<T>::resize(size_t), чтобы установить начальный размер.

+0

std :: array тоже может работать. – bitwise

0

Этот класс требует деструктора, поскольку он содержит указатель (массив дочерних элементов) для объекта, выделенного в куче. Без деструктора, когда экземпляр этого класса удаляется, дочерний массив остается в памяти: это называется утечкой памяти .

Чтобы создать деструктор, просто добавьте метод ~Person() к членам класса

~Person() 
{ 
    delete[] children; 
} 
+2

Неправильно удалять использование delete [] –

+1

Неправильный остаток. В любом случае, да, это освободит память, но это совершенно небезопасный способ написать класс. Что происходит, когда объект копируется? Правило три, правило пять ... –

+1

Редактирование неверно. Должно быть 'delete [] children' –

1

Было бы лучше, если вы будете использовать стандартный класс std::vector<std::string> вместо вручную выделенный массив. Например,

#ifndef PERSON_H 
#define PERSON_H 

#include <string> 
using namespace std; 
class Person 
{ 
public: 
    Person() 
    { 
    } 

    void addAChild(const string &name) 
    { 
     children.push_back(name); 
    } 
    vector<string> getChildren() const 
    { 
     return children; 
    } 
    int getNumberOfChildren() const 
    { 
     return children.size(); 
    } 
private: 
    vector<string> children; 
}; 
#endif 

В этом случае достаточно иметь неявно определенный деструктор.

Что касается вашего кода, тогда вам необходимо освободить выделенную память для детей массива. Таким образом, деструктор будет выглядеть

~Person() 
{ 
    delete []children; 
} 

Примите во внимание, что если вы возвращаете указатель на методе getChildren тогда каждый может изменить ребенок любого человека.

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