как освободить память после ASSERT_TRUE в gtest

У меня есть сценарий использования.

List* pList = new List();
for (...)
{

Integer* pInt = new Integer();
ASSERT_TRUE(pInt != NULL);
pList->Add(*pInt);

}

Теперь следует pInt быть нулевым в любой из итераций, тогда этот тестовый пример остановится и pList не будет освобожден.

Есть ли способ освободить pList когда ASSERT_TRUE выполняет?

Спасибо

2

Решение

Теперь следует pInt быть нулевым в любой из итераций, тогда этот тестовый пример остановится и pList не будет освобожден.

Предполагая, что вы не изменили new оператор (если вы это сделали, вы, вероятно, не спрашивали бы об этом), и предполагая, что ваш компилятор не глючит, pInt никогда не будет нулевым. При неудаче, new бросает std::bad_alloc исключение, он не возвращает ноль.

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

Теперь к освобождению … Приведенный пример кода может просто забывать new и использовать автоматические объекты:

List pList;
for (...)
{

Integer pInt = Integer();
pList.Add(pInt);
}
2

Другие решения

Если вы можете использовать лямбды, вы можете сделать:

ASSERT_TRUE(pInt != nullptr)
<< [pList]()->std::string { delete pList; return "Your error message."; }();

Лямбда выполняется только в том случае, если утверждение не выполнено.

Тем не менее, лучший вариант, вероятно, использовать std::unique_ptr или подобный умный указатель, а не сырые указатели и избегать беспокойства в целом.

1

По вопросам рекламы [email protected]