最佳实践是不要使用auto_ptr
。它将在C++0x中被弃用,并由std::unique_ptr
替换(参考:C++0x草案标准,附录D,第10段)。与此同时,替代方案包括std::tr1::shared_ptr
和boost::scoped_ptr
。
但是你的例子是一个数组,而那些指针类型不适用于数组。你可以使用boost::shared_array
来解决这个问题。
然而,标准本身没有数组智能指针。这可能是因为他们认为你应该使用std::vector
代替(或者在编译时知道大小的固定大小数组std::array
)。鉴于此,你可以这样做:
std::vector<uint32> dataVector
data.reserve(123)
// or, if the size is always 123:
std::tr1::array<uint32, 123> dataArray
现在,您可以调用接受常规普通的
uint32*
的函数,因为
vector
和
std::tr1::array
都有方法,可以将数据作为指向C风格数组的指针访问:
processData(&dataVector[0]);
processData(dataArray.data());
如果你要这样做,我强烈建议添加边界检查。将数组的大小作为第二个参数传递给processData
:
processData(&dataVector[0], dataVector.size());
如果你可以完全放弃C风格的指针/数组,更好的方法可能是通过引用传递:
void processData(std::vector<uint32>& data) {
// process the data
}
// call it like this:
processData(dataVector);
但这仅适用于vector
,而不适用于std::tr1::array
或任何其他容器。因此,更进一步,您可以使用接受迭代器的模板:
template <class AnIterator>
void processData(AnIterator begin, AnIterator end) {
for (AnIterator it = begin; it != end; ++it) {
}
}
processData(dataVector.begin(), dataVector,end());
processData(dataArray.begin(), dataArray.end());
processData(c_data, c_data + number_of_items_in_c_data);
最后一个有效是因为指向C风格数组的指针可以用作迭代器。