В качестве ответов ранее отмеченного класса «b» должен быть деструктор, удаляющий память, выделенную в конструкторе.Однако, как прокомментировал Мартин Йорк выше, это не исчерпывающий ответ.Как он отметил, здесь есть проблемы, о которых вам нужно позаботиться в отношении конструктора копирования и оператора присваивания, но я бы пошел еще дальше: прекратите использовать необработанные указатели и немедленно начните использовать умные указатели Boost .
Класс "b" переписан для использования boost :: shared_ptr <>:
class b
{
public:
b() { this->pointer.reset(new a); }
void call() { this->pointer->call(); }
private:
boost::shared_ptr<a> pointer;
};
Обратите внимание на две вещи:
- Нам не нужно писать явный деструктор как
shared_ptr
автоматически уничтожит объект, на который он указывает (дополнительную информацию об условиях см. в документации по нему). - Нам не нужно писать явный конструктор копирования или оператор присваивания, если мелкая копия объекта указана
pointer
достаточно, потому что shared_ptr
снова позаботится об этом автоматически, предоставив свой собственный конструктор копирования "мелкой копии" и операторы присваивания.
В следующем стандарте C ++ 0x также есть несколько умных указателейв том числе shared_ptr
.Также смотрите scoped_ptr
, а также shared_array
и scoped_array
в Boost.Это последнее, что я считаю особенно полезным при работе с C API, такими как Win32.