Мне неприятно это говорить, но ИМО, вы идете в неправильном направлении (и, к сожалению, другие ответы, которые вы получили, тоже не указали вам правильное направление).
Вместо того, чтобы выбирать между различными вариантами умного указателя и / или обычного или ненурового вариантов new
, вы должны , вероятно, сделать еще как минимум два шага назад от того, что вы делаете, и заменить ваши управляемые вручную динамические структуры данных с коллекциями. Это не может всегда быть правильным выбором, но по крайней мере, по моему опыту, это правильный путь к лоту чаще, чем нет. Стандартная библиотека имеет ряд возможностей (vector, deque, list, set и т. Д.), И вполне вероятно, что вы можете использовать одну из них, вместо того, чтобы напрямую иметь дело с new
и компанией.
По умолчанию они будут использовать распределитель, который в конечном итоге будет использовать обычный (бросающий) вариант new
. Поэтому вы обычно хотите поместить большую часть кода в блок try
на довольно высокий уровень и иметь предложение catch
, которое имеет дело с исчерпанием там памяти.
Когда / если вам действительно нужно иметь дело с выделением памяти напрямую, вполне вероятно, что вы все равно захотите предоставить интерфейс, аналогичный интерфейсу стандартных контейнеров в библиотеке, чтобы он работал с обычными алгоритмами и итераторами. Ваш первоначальный опыт использования существующих контейнеров окупится, когда вы доберетесь до этой точки, даже если это может быть в будущем.