У меня есть сценарий использования.
List* pList = new List();
for (...)
{
Integer* pInt = new Integer();
ASSERT_TRUE(pInt != NULL);
pList->Add(*pInt);
}
Теперь следует pInt
быть нулевым в любой из итераций, тогда этот тестовый пример остановится и pList
не будет освобожден.
Есть ли способ освободить pList
когда ASSERT_TRUE
выполняет?
Спасибо
Теперь следует
pInt
быть нулевым в любой из итераций, тогда этот тестовый пример остановится иpList
не будет освобожден.
Предполагая, что вы не изменили new
оператор (если вы это сделали, вы, вероятно, не спрашивали бы об этом), и предполагая, что ваш компилятор не глючит, pInt
никогда не будет нулевым. При неудаче, new
бросает std::bad_alloc
исключение, он не возвращает ноль.
Более того, утверждения для вещей это должно всегда держать (как это имеет место), несмотря ни на что. Ошибка подтверждения Жук. Нет смысла добавлять код для очистки после сбоя утверждения: просто исправьте ошибку.
Теперь к освобождению … Приведенный пример кода может просто забывать new
и использовать автоматические объекты:
List pList;
for (...)
{
Integer pInt = Integer();
pList.Add(pInt);
}
Если вы можете использовать лямбды, вы можете сделать:
ASSERT_TRUE(pInt != nullptr)
<< [pList]()->std::string { delete pList; return "Your error message."; }();
Лямбда выполняется только в том случае, если утверждение не выполнено.
Тем не менее, лучший вариант, вероятно, использовать std::unique_ptr
или подобный умный указатель, а не сырые указатели и избегать беспокойства в целом.