Если вы динамически распределили foo
, например:
foo* f = new foo;
, тогда delete f
уничтожит динамически размещенный объект foo
, включая содержащиеся в нем указатели, но не что-либона которые указывают указатели, если они действительно указывают на динамически размещенные объекты или массивы объектов.
Если вы назначили динамически распределенный объект foo
(т.е. результат new foo
) для shared_ptr
(при условии tr1 или boost), тогда когда последний shared_ptr
, ссылающийся на этот объект, выходит из области действия delete
, будет вызван указатель, первоначально возвращенный new foo
автоматически.Вам не нужно делать это вручную.
Если ваш объект (foo
) содержит указатели на динамически размещаемые объекты, которыми он владеет (поэтому необходимо освободить его в конце времени жизни foo
),тогда настоятельно рекомендуется написать деструктор для правильного освобождения этих объектов (что будет зависеть от того, как они распределены).
После того, как вы написали деструктор, вы должны решить, нужно ли вам писатьконструктор копирования и оператор копирования.Поскольку вы используете вектор общих указателей, вы можете решить, что ваши объекты не должны копироваться.Если это так, вы можете объявить их как частные и не должны предоставлять реализацию.
Вы также должны рассмотреть один или несколько конструкторов, чтобы гарантировать, что ваши члены-указатели инициализированы.Если элементы указателя никогда не инициализируются, то, если они не назначены в течение времени жизни foo
, тогда они не будут ни нулевыми, ни указывать на действительный объект, и это может вызвать ошибку в вашем деструкторе.