这是将 boost::scope_ptr 与数组一起使用的正确方法吗?
Is this the correct way to use the boost::scope_ptr with array?
由于 boost::scoped_ptr 不适用于 [] 索引运算符,我正在尝试使用这样的解决方法
{
boost::scoped_ptr<float> data_ptr;
float *data = new float(SIZE);
data_ptr.reset(data);
...
}
稍后会释放数组吗?有更好的方法吗?
float *data = new float(SIZE);
此行动态分配单个 float
并将其初始化为 SIZE
,它不是分配 SIZE
元素的数组。您显示的代码具有明确定义的行为,但显然不是您想要的。
动态分配数组使用
float *data = new float[SIZE];
// ^ ^
// use "new float[SIZE]()" if you want to zero initialize all the elements
但是,如果您这样做,您的代码现在具有未定义的行为,因为 scoped_ptr
将调用 delete
来销毁数组,但是因为使用 new[]
分配了内存,您需要delete[]
改为调用。解决方案是使用 boost::scoped_array
.
{
boost::scoped_array<float> data_ptr(new float[SIZE]);
data_ptr[0] = 0; // array indexing works too
...
} // delete[] will be called to destroy the array
由于 boost::scoped_ptr 不适用于 [] 索引运算符,我正在尝试使用这样的解决方法
{
boost::scoped_ptr<float> data_ptr;
float *data = new float(SIZE);
data_ptr.reset(data);
...
}
稍后会释放数组吗?有更好的方法吗?
float *data = new float(SIZE);
此行动态分配单个 float
并将其初始化为 SIZE
,它不是分配 SIZE
元素的数组。您显示的代码具有明确定义的行为,但显然不是您想要的。
动态分配数组使用
float *data = new float[SIZE];
// ^ ^
// use "new float[SIZE]()" if you want to zero initialize all the elements
但是,如果您这样做,您的代码现在具有未定义的行为,因为 scoped_ptr
将调用 delete
来销毁数组,但是因为使用 new[]
分配了内存,您需要delete[]
改为调用。解决方案是使用 boost::scoped_array
.
{
boost::scoped_array<float> data_ptr(new float[SIZE]);
data_ptr[0] = 0; // array indexing works too
...
} // delete[] will be called to destroy the array