в новейшей книге языка программирования C++, Bjarne представляет собой альтернативу ортодоксальной обработке ошибок, то есть использовать исключения. Это в главе 13.3.1, и он пишет:Проблемы с стратегией управления памятью
void test()
// handle undiciplined resource acquisition
// demonstrate that arbitrary actions are possible
{
int* p = new int{7}; // probably should use a unique_ptr (§5.2)
int* buf = (int*)malloc(100*sizeof(int)); // C-style allocation
auto act1 = finally([&]{ delete p;
free(buf); // C-style deallocation
cout<< "Goodby, Cruel world!\n";
}
);
int var = 0;
cout << "var = " << var << '\n';
// nested block:
{
var = 1;
auto act2 = finally([&]{ cout<< "finally!\n"; var=7; });
cout << "var = " << var << '\n';
} // act2 is invoked here
cout << "var = " << var << '\n';
}// act1 is invoked here
Хотя я понимаю, что он пытается объяснить и то, что этот код должен достичь, у меня есть проблемы с полагая, что этот фрагмент порей бесплатно:
> 1. int* p = new int{7}; // probably should use a unique_ptr (§5.2)
> 2. int* buf = (int*)malloc(100*sizeof(int)); // C-style allocation
>
>
> 3. auto act1 = finally([&]{ delete p;
> free(buf); // C-style deallocation
> cout<< "Goodby, Cruel world!\n";
> }
> );
Почему? Потому что, если в строке 2 (2) мы получаем исключение (предполагая, что вызов не вызывается в malloc, а в функцию, которая может фактически выполняться, поскольку я считаю, что концепция, которую Бьярн пытается объяснить, заключается в использовании окончательной конструкции и вызов malloc здесь неактуальен и случайен и может быть заменен любым вызовом), то если два броска, то 3 никогда не будут достигнуты, и у нас есть ресурс лука-порея от 1. Я прав?
Если функция, которая действует как таНос генерирует исключение, но перед этим выделяет некоторый объем памяти это не то бесплатно, то это очень очень непослушный. Зачем предполагать такое? Никто не здравомыслящий напишет это, имо. Если бы оно выбрало исключение, никто бы не узнал адрес памяти, которую вам нужно было бы освободить. – polkadotcadaver
Игнорируя, что, хотя в общих чертах, если есть исключение, возникает между распределением памяти и созданием «окончательного» объекта, то да, будет утечка. – polkadotcadaver
@polkadotcadaver: утечка не будет в '* buf', а в' * p'. –