2016-08-24 6 views
0

Некоторые из функций моего кода на C++ имеют временные локальные объекты, которые используют много памяти кучи. Поэтому я бы хотел, чтобы они были разрушены и освободили память, как только я покончу с ними. Но C++ только вызывает деструктор, когда имя переменной выходит за рамки. Есть ли способ позволить компилятору автоматически вызывать деструктор или другой метод очистки в конце диапазона активности?Есть ли способ получить C++ деструкторы, вызываемые с нетерпением?

Конечно, я мог бы просто добавить/удалить объекты вручную, но это неудобно и подвержено ошибкам. В равной степени неудовлетворительно использование дополнительных фигурных скобок, чтобы ограничить область действия явно.

EDIT: Судя по ответам, похоже, что этого не может быть сделано с текущими функциями C++. Я предложу его для следующего стандарта.

+1

Что вы имеете в виду с «диапазоном жизнедеятельности»? Вы, возможно, ищете умные указатели? – user463035818

+12

Очень похоже, что ваши функции слишком длинны. – dhke

+0

Как насчет использования метода 'clear', который можно вызвать вручную, но также будет вызываться деструктором? –

ответ

5

Вы можете использовать внутренний объем, но это, как правило, признак того, что вы могли бы использовать функцию суб

void foo() 
{ 

    // some stuff 
    { 
     BigData bigData; 

     // some other stuff 
    } // bigData is released now. 

    // some other stuff 
} 

Это не обрабатывает перемежения переменные.

+1

«В равной степени неудовлетворительно использование дополнительных фигурных скобок, чтобы ограничить область видимости». OP не имеет брекетов (но им, вероятно, придется иметь дело с ними :-)) – AndyG

+0

@AndyG: Действительно, не читайте последнее предложение:/ – Jarod42

+5

@AndyG: Еще более одинаково неудовлетворительно бессмысленные ограничения, сделанные без каких-либо причин. –

1

Нет, деструктор, по определению, вызывается только как часть последовательности уничтожения объекта.

Однако ничто не мешает вам освобождать и освобождать любые ресурсы вашего класса, не дожидаясь деструктора.

Например, если у вашего класса есть большой член класса std::list, нет закона, запрещающего вам вызывать clear(), чтобы удалить его содержимое, не дожидаясь, что это произойдет естественным образом в деструкторе.

Или, если ваш деструктор класса является «безопасным» и делает то, что нужно сделать, просто воспользуйтесь его методом частного класса, в результате чего деструктор не будет содержать ничего, кроме вызова частного метода, и делать то же самое всякий раз вы хотите освободить те же ресурсы.

1

Если это действительно стоит (измерьте хотя бы дважды!), Вы можете использовать std::optional, чтобы вы могли быстрее уничтожить выбранные типы классов.

Убедитесь, что вы не можете достичь своей цели, используя область обзора.

+0

Как это автоматически разрушит объект при последнем использовании? –

+0

@NicolasCapens: Невозможно автоматически уничтожить его при последнем использовании, тем более что существование объектов может быть важным (например, учитывать состояние программы блокировки или сигнализации). Это всего лишь самое близкое, что позволяет вам создавать/уничтожать раньше и следить за тем, чтобы жизнь все еще управлялась должным образом. – Deduplicator

0

Один из способов управления временем жизни объекта - использовать std::optional. Это позволит объекту досрочно завершить работу, но процесс не является автоматическим. Для этого потребуется вручную изменить значение переменной на nullopt

Чтобы получить автоматическое поведение, которое вы хотели бы вы могли бы определить тип псевдонима std::optional

template <typename T> 
using eagerly_destroy = optional<T>; 

Далее вам нужно будет создать программу, которая обрабатывать исходный код найдите все переменные, объявленные с помощью этого шаблона eagery_destroy, и найдите последнее использование этих переменных и добавьте = nullopt в нужные места.

Или вы можете найти реализацию компилятора с открытым исходным кодом и использовать это как отправную точку для реализации функции, которую вы предлагаете.

 Смежные вопросы

  • Нет связанных вопросов^_^