如果您使用 C++11,您可能应该使用unique_ptr<T[]>
而不是scoped_array<T>
. 它可以做所有可以做的事情,scoped_array
然后是一些。
如果你想要一个矩形数组,我建议使用 aunique_ptr<double[]>
来保存主要数据并使用 aunique_ptr<double*[]>
来保存行基数。这将像这样工作:
unique_ptr<double[]> data{ new double[5*3] };
unique_ptr<double*[]> rows{ new double*[3] };
rows[0] = data.get();
for ( size_t i = 1; i!=5; ++i )
rows[i] = rows[i-1]+3;
然后你可以传递rows.get()
给一个函数double**
。这种方法也适用于非矩形数组,前提是数组的几何形状在数组创建时是已知的,这样您就可以一次分配所有数据并指向rows
正确的偏移量。(不过,它可能不像简单的循环那么简单。)
这也将为您提供更好的参考位置和内存使用情况,因为您只执行两次分配。您的所有数据都将一起存储在内存中,单独分配不会产生额外的开销。
如果要在创建锯齿状阵列后更改其几何形状,则需要提出一种管理存储的原则方法,以使该解决方案适用。但是,由于使用更改几何形状scoped_array
很尴尬(需要特定用途swap()
),如果这对您来说不是问题,我不会感到惊讶。
(请注意,这种方法也可以scoped_array
与.unique_ptr<[]>
unique_ptr