我正在学习c ++而且我在一个新问题上又一次跌跌撞撞。
我确实需要为要使用的库分配一个C数组,但是以安全的方式,当然。我已经发现删除[];方法结束时惨遭失败。
老人,不是那么好: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分配到新的{}范围之后...解释我和像我这样的未来更多的未来。 在这种情况下如何处理异常?
答案 0 :(得分:2)
首选std::unique_ptr
至shared_ptr
。它的速度要快得多。
std::unique_ptr<float[]> buf; //construct
try {
buf.reset(new float[daswidth*chans_info.chans*sizeof(float)]); //give memory
}
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.
}
然而,正如Ben
所说,几乎没有理由像这样使用float[]
。相反,请使用std::vector
。是的,即使是大多数* C互操作。
std::vector<float> buf;
try {
buf.resize(daswidth*chans_info.chans*sizeof(float)); //give memory
}
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.
}
function_expecting_float_pointer(buf.data()); //use .data() to get the `float*`
*如果C代码将为您“重新分配”指针,请不要使用std::vector
。相反,使用std::unique_ptr
,并且(1)释放内存,(2)传递给C,(3)使用从C返回的指针重置。