7

我有一个类(在许多其他事物中)有一个指向 unsigned char 的指针,该指针被删除并重新分配以存储来自另一个数组的一些数据。这是用一个函数完成的

 class MyClass {
  private:
      unsigned char* m_Buffer;
      int m_BufferSize;
  public:
      bool SetBuffer(int iSize, const unsigned char* pArray); 
 };

 bool MyClass::SetBuffer(int iSize, const unsigned char* pArray) {
     bool bOK = false;
     if (pArray != NULL  && iSize > 0) {
         delete [] m_Buffer;
         m_Buffer = new unsigned char[iSize];
         memcpy(m_Buffer,pArray,iSize);
         m_BufferSize = iSize;
         bOK = true;
      }
      return bOK;
  }

我根本不喜欢这段代码,我真的很想用std::vector<unsigned char>. 我的问题是,我将如何执行 memcpy 方面?如果我将向量作为参数传递给我的函数,我可以使用迭代器复制它,但我无法控制参数参数类型,所以我坚持使用unsigned char*. 有没有一种方法可以使用迭代器,或者将向量调整为正确的大小,然后访问其内部数组,以便我仍然可以使用 复制数据memcpy?或者甚至更好的东西使用迭代器?我知道我可以使用循环,push_back但这对我来说似乎效率低下。任何建议将不胜感激。

4

2 回答 2

20

实际上,迭代器是从指针建模的,因此数组中的指针被认为是实现这一RandomAccessIterator概念。

所以:

m_buffer.assign(pArray, pArray + Size);
于 2012-08-20T09:39:50.793 回答
0

我真的建议您以这种方式避免使用原始指针。我认为管理 std::vectors 而不是原始指针是一个更好的主意。

class MyClass {
private:
    std::vector<unsigned char> m_Buffer;
    // No size member is needed, it is stored in m_Buffer
public:
    // No size parameter is needed, it is stored in Array
    void SetBuffer(const std::vector<unsigned char> &Array);
};

void MyClass::SetBuffer(const std::vector<unsigned char> &Array) {
    std::copy(Array.begin(), Array.end(), m_Buffer.begin());
}

假设您的设计强制为MyClass您管理 raw 将在复制构造函数上处理此指针,并且operator =(或改为摆脱它):

MyClass::MyClass(const MyClass &Class) {
    m_BufferSize = Class.m_BufferSize;
    m_Buffer = new new unsigned char[m_BufferSize];
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
}

MyClass::operator =(const MyClass &Class) {
    if (m_Buffer) delete [] m_Buffer;
    m_BufferSize = Class.m_BufferSize;
    m_Buffer = new new unsigned char[m_BufferSize];
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
}

如果您不处理MyClass复制构造函数中的托管指针,operator =那么您将以MyClass管理相同内存的两个实例结束。

于 2012-08-20T10:00:57.820 回答