无符号字符数组的自动指针?

时间:2010-04-26 12:49:24

标签: c++

我需要一个像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

有更优雅的方法来解决这个问题吗? (甚至使用另一个“流行”图书馆)

4 个答案:

答案 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)

  1. 您所说的是一组int,而不是具有析构函数的复杂C ++类型。 对于这样的数组,调用delete[]等同于调用delete。因此使用std::auto_ptr没有问题。

  2. 你建议的方法是非常野蛮的恕我直言。你实际上分配了两次内存:一次用于所需的数组,然后你还分配一个ArrayDeleter的实例,它封装了指向已分配数组的指针。

  3. 这种方法的缺点是:

    • 性能更差。堆操作很重。它们也有很大的内存开销。
    • 访问速度较慢。要通过std::auto_ptr<Bytes>访问数组的元素,编译器将生成两个间接:一个用于获取Bytes对象,另一个用于访问元素。 简单来说:std::auto_ptr有一个指向Bytes对象的指针,它有一个指向数组的指针。
    • 更糟糕的错误/异常一致性。想象一下如果operator new无法分配Bytes对象会怎样。它会生成一个可以处理的异常。但此时你已经已经分配了数组。这种分配将会丢失。

    我会做以下其中一项:

    1. 如果你在谈论普通类型 - 只需使用std::auto_ptr<type>。这应该做的工作。但是,您应该使用编译器进行检查。

    2. 对于复杂类型:您可以创建自己的包装器而不是std::auto_ptr

    3. 另一种变体:类似于你所做的。但是你应该摆脱额外的内存分配和间接。