Я изучаю С++, и я снова наткнулся на новую проблему.
Мне нужно выделить массив C для использования библиотекой, но, конечно, безопасным способом. Я уже нашел, что delete[]; в конце метод терпит неудачу с треском.
СТАРЫЙ, не очень хороший:
float *buf;
try {
buf = new float[daswidth*chans_info.chans*sizeof(float)];
}
catch (std::bad_alloc& ba) // sometimes it throws ! so i do need to stop my execution.
{
if (DEBUG) tekstasFormat(L"WARNING: bad alloc caught: %s", ba.what());
return; // skip this iteration then.
}
//... OUR CODE
delete[] buf;
Итак, что я пытался использовать, что отлично работает вместо моего старого выделения и удаления:
float *buf;
std::shared_ptr<float> safe_buf(new float[daswidth*chans_info.chans*sizeof(float)], [](float *p) { delete[] p; });
// OR BOOST EQUIVALENT
boost::shared_array<float> safe_buf(new float[daswidth*chans_info.chans*sizeof(float)]);
buf = safe_buf.get();
И у нас никогда не течет, все довольны. Но как теперь ловить броски new_alloc?!
если я выделю shared_ptr в новой {} области после того, как новая будет уничтожена ... Объясните мне и таким нубам, как я, на будущее немного больше. Как обрабатывать исключения в этом случае?
std::vector
? - person Fantastic Mr Fox   schedule 24.12.2014std::vector
на самом деле содержитT*
, который создается при его инициализации. Будут небольшие накладные расходы на проверки и функции, вызываемые при его использовании, но это определенно того стоит. - person Fantastic Mr Fox   schedule 24.12.2014sizeof(float)
здесь кажется подозрительным. Не знаю, каков ваш вариант использования, ноnew float[n*sizeof(float)]
выделяетn*sizeof(float)
числа с плавающей запятой, а неn*sizeof(float)
байта. Просто чтобы вы знали. - person milleniumbug   schedule 24.12.2014