Действительно ли я являюсь сумасшедшим воссоздать крошечную систему сборки "мусора" в своих функциях?

Я думаю, что необходимо сфокусироваться на производительности. Если можно создать приложение, которое показывает различие в производительности при использовании DataSets по сравнению с Пользовательскими Объектами. Кроме того, попытайтесь показать им Доменные Управляемые Принципы разработки и как это соответствует платформам объекта.

8
задан casperOne 5 April 2012 в 18:44
поделиться

5 ответов

Вам не нужно полагаться на сборку мусора.

У вас есть std :: auto_ptr, который предоставляет указатель, как синтаксис, и обертывает динамически выделяемый объект. При уничтожении он автоматически уничтожает объект, на который указывает.

Вы можете реализовать нечто подобное для массивов.

2
ответ дан 5 December 2019 в 04:46
поделиться

Почему бы не использовать умный указатель вроде boost :: shared_array или использовать выделенный стеком std :: vector ? Для одиночного выделения, а не выделения массива, вы можете использовать boost :: shared_ptr .

Они реализуют RAII за вас. Даже если вы повторно используете такую ​​концепцию, как RAII, вы все равно изобретаете колесо, если уже существует конкретная реализация, удовлетворяющая вашим требованиям.

19
ответ дан 5 December 2019 в 04:46
поделиться

Вместо

try
{
   set<ArrType*> sHeap;
   ArrType* myArr = new ArrType[5];
   sHeap.Add(myArr);
   someExternalRoutine(myArr);
   ...
} 

Вам просто нужно:

{
   std::vector <ArrType> myArr(5);
   someExternalRoutine(myArr);
}

без блока catch. Все выделение и освобождение (независимо от того, генерируются исключения или нет) будут обрабатываться за вас - это RAII.

8
ответ дан 5 December 2019 в 04:46
поделиться

Looks like you are overthinking it.

Rather than useing try {} catch {} use the RAII.
There are several ways to do this looking through the comments (all seem valid).

Option 1:
If you just need a single fixed(or expanding set of ArrType).
Where the lifespan ends at the end of the function

std::vector<ArrType>

Option 2:
If you need multiple arrays of ArrType Where the lifespan ends at the end of the function

boost::ptr_vector<ArrType> 

This also allows you to remove the array from the ptr_vector when the object has a longer lifespan.

Notes on try {} catch {}

  • Catch by ref
    • If you catch by a specific type you are suseptable to the slicing problem as derived types are copy constructed into the variable defined in the catch expression.
  • Prefer to catch by const ref
  • When re-throwing use throw; (without the expression)
    • This will re-throw the original exception rather than copying the new exception into the place where the exception handling mechanism hides the exception during stack unwinding.
2
ответ дан 5 December 2019 в 04:46
поделиться

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

Затем, когда этот объект выходит за пределы области видимости, он освобождает все, независимо от того, когда он выходит за пределы области видимости, даже за исключением.

10
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: