Ну, о вашем коде можно многое сказать. Некоторые вещи уже были сказаны, например, что вы должны сделать строку нормальным членом, чтобы проблема выделения / отключения не устранялась полностью (это общее правило для программ на C ++: если вам абсолютно не нужно использовать динамическое выделение, то не делайте, точка ). Кроме того, использование подходящего интеллектуального указателя сделает управление памятью за вас (также общее правило в C ++: не управляйте динамическим распределением самостоятельно, если вам не нужно).
Однако давайте представим, что вам нужно использовать динамическое распределение, и вы должны использовать необработанные указатели и прямые new
и delete
здесь. Затем приходит другое важное правило (которое на самом деле не является специфическим правилом C ++, а общим правилом OO): не делайте члена открытым. Сделайте его закрытым членом и предложите функцию открытого члена для его настройки. Эта общедоступная функция-член может затем правильно удалить старый объект перед назначением указателя на новый. Обратите внимание, что как только вы присвоили указатель, если вы не сохранили старое значение в другом месте, старое значение будет потеряно навсегда, и если объект не был удален до этого момента, вы не сможете удалить его позже.
Вы также хотите рассмотреть, действительно ли это хорошая идея - взять на себя ответственность за объект, переданный вам по указателю (и присвоить элементу-указателю, который имеет удаление в деструкторе , является a - не очень очевидно - способ передачи права собственности). Это усложняет управление временем жизни объекта, потому что вы должны помнить, передали ли вы определенный объект объекту, требующему владения (это не проблема, если у вас строгая политика всегда , передающая объектам, требующим владения, хоть). Как обычно, умные указатели могут помочь здесь; однако вы можете подумать, лучше ли сделать копию переданного объекта (для std::string
это определенно так, но в любом случае здесь лучше иметь прямой член, как упоминалось выше).
Итак, вот полный список правил, где более ранние правила имеют приоритет перед более поздними, если нет веских причин не использовать их:
- Не использовать динамическое распределение.
- Управляйте своим динамическим размещением с помощью умных указателей.
- Используйте
new
только в конструкторах и delete
только в соответствующем деструкторе.
- Всегда имейте
new
и delete
для определенного указателя в функциях-членах одного и того же класса. (На самом деле предыдущее правило является частным случаем этого, но частным случаем, который следует отдавать предпочтению общему.)