Нет такой вещи как "простой объект".Объект - это объект - это объект.
Что имеет значение, так это объект время жизни : автоматический (с областью действия), динамический (ручной) или статический (постоянный).
Asнасколько вы можете, и если у вас нет действительно веской причины поступить иначе, используйте объекты с автоматическим временем жизни.
Если вы подумаете о том, как один объект может зависеть от другого, вы увидите, что если выТолько когда вы используете автоматические объекты, у вас не будет проблем с висячими ссылками (или «ссылками на локальную переменную»), потому что у зависимого объекта будет более глубокая вложенная область действия, чем у ссылочного объекта.
Вы должныиметь очень убедительный аргумент, почему конкретный объект должен иметь ручное время жизни.Конечно, такие ситуации случаются, но их следует абстрагировать и учитывать.Например, большинство стандартных контейнеров библиотеки, конечно, требуют ручного управления своими элементами, но все, что обрабатывается контейнером, так что пользователь может просто использовать объект контейнера с автоматическим временем жизни, и все в порядке.Наконец, если вы решили, что вам действительно нужно управлять временем жизни объекта вручную, то используйте класс управления ресурсами с одной ответственностью, такой как shared_ptr
или unique_ptr
, чтобы передать дескриптор этому объекту - классы-обработчики теперь снова автоматически,и как только они выходят из области видимости, они освобождают управляемый объект для вас.Вы получаете лучшее из обоих миров: преимущества ручного распределения объектов и сфер ответственности.
Если вы будете следовать этим идеям методично, вы обнаружите, что вы очень редко будете создавать динамические объекты самостоятельнои, если вы это сделаете, то есть одна строка кода, которая имеет отношение (это дает вам «локальность»);например, auto p = std::make_shared<T>(a,b,c);
или std::unique_ptr<T> p(new T(a,b,c));
.Простой grep
для new
для всего вашего исходного кода может легко проверить, все ли ваши динамические выделения обрабатываются ответственно.