代码之家  ›  专栏  ›  技术社区  ›  Gianluca

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

c++
  •  3
  • Gianluca  · 技术社区  · 15 年前

    我需要一个类,如STD::AutoMyPTR,用于一组未签名的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
    

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

    4 回复  |  直到 15 年前
        1
  •  11
  •   John Gordon    15 年前

    boost有很多自动指针,包括数组指针。你是否考虑过STD::向量是否足够?向量保证在内存中是连续的,如果您提前知道大小和分配的内存,那么内存中的位置不会改变。

        2
  •  3
  •   fredoverflow    15 年前

    然后我必须调用一个以无符号char*作为参数的方法。

    std::vector<unsigned char> vec;
    .
    .
    .
    legacy_function(&vec[0], vec.size());
    
        3
  •  2
  •   Thomas    15 年前

    用一下怎么样 std::basic_string<unsigned char> ?或者也许 std::vector<unsigned char> ?

        4
  •  -1
  •   valdo    15 年前
    1. 你说的是一系列 int ,而不是具有析构函数的复杂C++类型。 对于这样的数组调用 delete[] 相当于打电话 delete . 所以用起来没问题 std::auto_ptr .

    2. 你建议的方法太野蛮了。实际上,您分配了两次内存:一次分配给所需的数组,然后还分配了 ArrayDeleter ,它封装指向已分配数组的指针。

    这种方法的缺点是:

    • 糟糕的表现。堆操作很重。此外,它们还有很大的内存开销。
    • 访问速度较慢。通过 std::auto_ptr<Bytes> 编译器将生成两个间接指令:一个是 Bytes 对象,另一个访问元素。 简单地说: STD:AutoPyTPR 有一个指针指向 字节 对象,它具有指向数组的指针。
    • 错误/异常一致性较差。想象一下如果 operator new 无法分配 字节 对象。它将生成一个可以处理的异常。但现在你已经 已经 分配了数组。而这一分配将会丢失。

    我将执行以下操作之一:

    1. 如果你说的是普通类型的-就用 std::auto_ptr<type> . 这样就可以了。不过,您应该与编译器一起检查它。

    2. 对于复杂类型:可以创建自己的包装器,而不是 STD:AutoPyTPR .

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