c++;新的C数组分配,RAII或简单共享\u ptr/boost::共享\u数组 我正在学习C++,我又一次在新的问题上绊倒了。

c++;新的C数组分配,RAII或简单共享\u ptr/boost::共享\u数组 我正在学习C++,我又一次在新的问题上绊倒了。,c++,raii,C++,Raii,我确实需要为库分配一个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 (DEB

我确实需要为库分配一个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();
float*buf;
std::shared_ptr safe_buf(新浮点[daswidth*chans_info.chans*sizeof(float)],[](float*p){delete[]p;});
//或增压当量
boost::共享阵列安全buf(新浮点[daswidth*chans\u info.chans*sizeof(float)];
buf=safe_buf.get();
我们从不泄密,每个人都很快乐。 但是现在怎么接住新的球

如果在新的{}作用域被销毁后,我将在新的{}作用域中分配共享的\u ptr。。。对我和像我这样的人的未来多解释一点。
在这种情况下如何处理异常?

更喜欢
std::unique\u ptr
而不是
shared\u 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.
}

*如果C代码将为您“重新分配”指针,请不要使用
std::vector
。相反,使用
std::unique\u ptr
,并且(1)释放内存,(2)传递到C,(3)使用从C返回的指针重置。

是否有不能使用
std::vector
的原因?
std::vector
实际上包含一个
T*
,它是在初始化时创建的。当使用它时,在检查和调用函数方面会有一些小的开销,但这绝对值得。在这里,
sizeof(float)
似乎很可疑。不知道您的用例是什么,但是
newfloat[n*sizeof(float)]
分配
n*sizeof(float)
float,而不是
n*sizeof(float)
字节。你知道的,谢谢你,我需要的是重置。在分配新数据时重置ptr的大小是我不知道的方法。但是,有一个问题-在与c数组相同的使用范围内,c数组不是比vector快吗?@Arnas:只有一种非常具体的方式:c数组默认情况下不会初始化数据,
vector
将尝试默认初始化它的元素。正确而谨慎地使用向量将使它们保持相同的速度,但如果你不知道自己在做什么,理论上有时会稍微慢一点。然而,它总是非常容易和安全。使用它。总是。好吧,在我的情况下,我更喜欢unique_ptr,因为它会以100Hz的速率初始化整个阵列,而这根本不是必需的。@Arnas:(1)没有什么理由需要代码以100Hz的速率运行。通常,60Hz是一个最大值。(2)唯一不需要的时间是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*`