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());
}

あなたのdesingがあなたのためにrawを管理することを強制すると仮定するとMyClass、コピーコンストラクターでこのポインターを処理し、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 =2 つのインスタンスで終了します。MyClass

于 2012-08-20T10:00:57.820 に答える