繁体   English   中英

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

[英]Auto pointer for unsigned char array?

我需要一个像 std::auto_ptr 这样的类,用于使用 new[] 分配的 unsigned char* 数组。 但是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

有没有更优雅的方法来解决这个问题? (即使使用另一个“流行”库)

Boost 有多种自动指针,包括用于数组的指针。 您是否考虑过 std::vector 是否足够? 向量保证在内存中是连续的,如果你知道大小并通过reserve()resize()提前分配内存,内存中的位置不会改变。

然后我必须调用一个将 unsigned char* 作为参数的方法。

std::vector<unsigned char> vec;
.
.
.
legacy_function(&vec[0], vec.size());

使用std::basic_string<unsigned char>怎么样? 或者std::vector<unsigned char>

  1. 你在谈论一个int数组,而不是具有析构函数的复杂 C++ 类型。 对于这样的数组,调用delete[]等效于调用delete 所以使用std::auto_ptr没有问题。

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

这种方法的缺点是:

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

我会执行以下操作之一:

  1. 如果您谈论的是普通类型 - 只需使用std::auto_ptr<type> 这应该可以完成工作。 但是你应该用你的编译器检查它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM