Вероятно, лучше (более эффективно и легче избежать утечек памяти) переназначить объект в соответствии с первым примером, чем выделять новый объект - как показывает утечка памяти во втором примере.
Этовыглядит очень похоже на то, что вам вообще не нужен указатель;просто вставьте объект в ваш класс:
class foo {
private:
class1 class1Object;
public:
// implicit constructors, assignment and destructor are fine
void foomethod() {class1Object = some_method();}
};
Ваша вторая ситуация не имеет смысла - все объекты определенного класса имеют одинаковый размер.
Если вам действительно нужно хранить указатель(возможно, потому что вам нужен полиморфизм), тогда самый простой способ справиться с ним - это умный указатель:
class foo {
private:
std::unique_ptr<class1> class1ObjectPointer;
public:
foo() : class1ObjectPointer(new class1) {}
// implicit copying and destructor are fine
foomethod() {*class1ObjectPointer = some_method();}
// or, if not assignable, class1ObjectPointer.reset(new class1(*some_method()));
};
Если вы действительно хотите управлять им самостоятельно, тогда вам нужно переопределить конструктор копирования по умолчаниюи оператор копирования-копирования в соответствии с правилом трех , убедитесь, что вы удаляете старый объект при переназначении указателя, и будьте осторожны с безопасностью исключений.И нет необходимости либо проверять NULL
перед удалением, либо назначать NULL
в деструкторе.