Можно ли уменьшить размер удаляемого кода с помощью шаблонов в C ++? - PullRequest
0 голосов
/ 14 февраля 2020

У меня много предметов, я удаляю. Для каждого элемента я вызываю следующие строки связанных кодов:

if (item) {
   delete item;
   item=nullptr;
}

, поэтому вместо этого я рассматриваю возможность использования шаблонов путем определения одной функции:

template <typename T>
void delete_it(T &item) {
    if (item) {
       delete item;
       item=nullptr;
    }
}

из этого следующие строки работают нормально:

delete_it(an_item);
delete_it(another_item);

Я проверил это, динамически выделяя символьный массив, и он, кажется, работал нормально. Тем не менее, я не видел его где-либо использовать. Это подходящий способ удаления? Есть ли функция библиотеки (например, std) делает именно это? Спасибо,

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020
 if (item) {
       delete item;

if здесь бесполезен. Вам это не нужно.

Я проверил это, динамически выделяя массив символов ... Это подходящий способ удаления?

delete not подходящий способ удаления динамического c массива, созданного с помощью new[]. Только delete[].


Я не видел, чтобы он использовался где-либо

delete обычно используется только в деструкторе класса RAII , В таком контексте установка указателя на ноль является излишней, поскольку указатель собирается прекратить существование. Возможно, именно поэтому вы не видели, что делаете в других местах.

Более того, передовой практикой является применение принципа единой ответственности и использование интеллектуального указателя или контейнера вместо добавления новых и удаления. вручную. Существует стандартный контейнер для динамических c массивов: std::vector, а также стандартный контейнер для символьных массивов, представляющих строки: std::string.

Дополнительное напоминание: избегайте ненужных динамических c выделений.

0 голосов
/ 14 февраля 2020

Заменить

Type *item;
...
if (item) {
   delete item;
   item=nullptr;
}

На:

std::unique_ptr<Type> item;
...
item.reset();

Для массивов:

std::vector<Type> items;
...
items.clear();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...