c ++新的C数组分配,RAII或简单的shared_ptr / boost :: shared_array

时间:2014-12-24 00:01:40

标签: c++ raii

我正在学习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分配到新的{}范围之后...解释我和像我这样的未来更多的未来。 在这种情况下如何处理异常?

1 个答案:

答案 0 :(得分:2)

首选std::unique_ptrshared_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返回的指针重置。