#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
ответ
Класс требует деструктора, потому что он выделяет массив строк в куче в конструкторе.
Если класс выходит из области действия без удаления этого массива строк, у вас будет утечка памяти.
Редактировать: вы должны использовать вместо этого std::vector
. Просто позвоните vector<T>::resize(size_t)
, чтобы установить начальный размер.
std :: array
Этот класс требует деструктора, поскольку он содержит указатель (массив дочерних элементов) для объекта, выделенного в куче. Без деструктора, когда экземпляр этого класса удаляется, дочерний массив остается в памяти: это называется утечкой памяти .
Чтобы создать деструктор, просто добавьте метод ~Person()
к членам класса
~Person()
{
delete[] children;
}
Неправильно удалять использование delete [] –
Неправильный остаток. В любом случае, да, это освободит память, но это совершенно небезопасный способ написать класс. Что происходит, когда объект копируется? Правило три, правило пять ... –
Редактирование неверно. Должно быть 'delete [] children' –
Было бы лучше, если вы будете использовать стандартный класс 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
тогда каждый может изменить ребенок любого человека.
- 1. Какой из следующих случаев требует виртуального деструктора?
- 2. jQuery Как добавить класс в следующий iframe?
- 3. Почему следующий код требует инициализации указателем?
- 4. Класс деструктора в TObject и NIL Delphi
- 5. освобождение памяти, статический класс деструктора?
- 6. Добавить класс, только если элемент требует прокрутки
- 7. Как упростить следующий класс
- 8. Добавить один tr в следующий текущий tr
- 9. Почему нет статического деструктора?
- 10. Как добавить дополнительный класс в следующий PHP-код?
- 11. Почему один требует getElementById, а другой не
- 12. Почему класс, созданный создателем Qt, не имеет деструктора?
- 13. Удаляет ли суперкласс класс деструктора его полей?
- 14. JFrame добавить только один класс
- 15. Как добавить класс, если один тег?
- 16. JQuery выбрать следующий класс
- 17. Почему шаблон прокси требует наследования?
- 18. Требует ли C++ вызова деструктора для каждого нового места?
- 19. Как переключить следующий класс ul?
- 20. Почему использовать один инкрементора класс
- 21. Почему System.Windows.Forms.HtmlDocument требует полного доверия?
- 22. Почему у bool нет деструктора?
- 23. Почему у структур нет деструктора?
- 24. Когда класс требует подкласс?
- 25. Виртуальных случаи использование деструктора
- 26. Почему цель требует контекста?
- 27. JQuery Toggle следующий класс
- 28. JQuery следующий класс
- 29. Android- Следующий класс функция
- 30. Jquery следующий класс HREF
Код как опубликованный - это определение класса. Это не требует деструктора, поэтому основное утверждение в вопросе неверно. Опубликуйте полный, но минимальный пример, демонстрирующий проблему, и не забудьте описать проблему. –
Это «требует» деструктора в том смысле, что в противном случае вы будете утечки памяти. Однако нет необходимости в 'new', если вы просто выделяете массив фиксированного размера. 'string children [20];' достаточно. –
Или, так как вы даже не проверяете наличие вне пределов, возможно, 'std :: vector' поэтому он может расти по мере необходимости (также не нужно использовать 'new') –
crashmstr