我需要一个像std :: auto_ptr这样的类来表示一个unsigned char *数组,用new []分配。但是auto_ptr只调用delete而不是delete [],所以我不能使用它。
我还需要一个创建并返回数组的函数。我在类ArrayDeleter中出现了我自己的实现,我在这个例子中使用了它:
#include <Utils/ArrayDeleter.hxx>
typedef Utils::ArrayDeleter<unsigned char> Bytes;
void f()
{
// Create array with new
unsigned char* xBytes = new unsigned char[10];
// pass array to constructor of ArrayDeleter and
// wrap it into auto_ptr
return std::auto_ptr<Bytes>(new Bytes(xBytes));
}
...
// usage of return value
{
auto_ptr<Bytes> xBytes(f());
}// unsigned char* is destroyed with delete[] in destructor of ArrayDeleter
有更优雅的方法来解决这个问题吗? (甚至使用另一个“流行”图书馆)
答案 0 :(得分:11)
Boost有各种自动指针,包括数组。你有没有考虑过std :: vector是否足够?保证向量在内存中是连续的,如果你提前知道大小和分配的内存,内存中的位置就不会改变。
答案 1 :(得分:3)
然后我必须调用一个以unsigned char *作为参数的方法。
std::vector<unsigned char> vec;
.
.
.
legacy_function(&vec[0], vec.size());
答案 2 :(得分:2)
如何使用std::basic_string<unsigned char>
?或者也许是std::vector<unsigned char>
?
答案 3 :(得分:-1)
您所说的是一组int
,而不是具有析构函数的复杂C ++类型。
对于这样的数组,调用delete[]
等同于调用delete
。因此使用std::auto_ptr
没有问题。
你建议的方法是非常野蛮的恕我直言。你实际上分配了两次内存:一次用于所需的数组,然后你还分配一个ArrayDeleter
的实例,它封装了指向已分配数组的指针。
这种方法的缺点是:
std::auto_ptr<Bytes>
访问数组的元素,编译器将生成两个间接:一个用于获取Bytes
对象,另一个用于访问元素。
简单来说:std::auto_ptr
有一个指向Bytes
对象的指针,它有一个指向数组的指针。operator new
无法分配Bytes
对象会怎样。它会生成一个可以处理的异常。但此时你已经已经分配了数组。这种分配将会丢失。我会做以下其中一项:
如果你在谈论普通类型 - 只需使用std::auto_ptr<type>
。这应该做的工作。但是,您应该使用编译器进行检查。
对于复杂类型:您可以创建自己的包装器而不是std::auto_ptr
。