0

レイジー コピーを使用しているクラスがあります。コピー コンストラクターが呼び出されると浅いコピーが作成され、1 つのメソッドが呼び出されるとディープ コピーが作成され、さらにデータが追加されます。

その浅いコピーから深いコピーを作成する必要がある部分で立ち往生しています。

ディープ コピーは次のようになります。

  m_count = copy.m_count;
  k = copy.k;
  m_record = new TRecord * [k*SIZE];
  char * temp;
  for(int i=0;i<m_count;i++) {
    m_record[i] = new TRecord;
    temp = new char[12];
    strcpy(temp, copy.m_record[i]->Id);
    m_record[i]->Id = temp;

    temp = new char[strlen(copy.m_record[i]->Name) + 1];
    strcpy(temp, copy.m_record[i]->Name);
    m_record[i]->Name = temp;

    temp = new char[strlen(copy.m_record[i]->Surname) + 1];
    strcpy(temp, copy.m_record[i]->Surname);
    m_record[i]->Surname = temp;
  }

しかし、その方法を実装する方法がわかりません。一時オブジェクトを作成して *this で埋めようとしました

temp.m_count = this->m_count;...

そして最後に

*this=temp;

しかし、うまくいきません。

そもそもディープコピーを作成しないのはなぜですか? 非常に多くのコピーがあり、変更されるのはごくわずかであり、大量のメモリを消費するためです。

どうすればいいですか?

PS このタスクで STL と文字列を使用することは禁止されています。

4

1 に答える 1

0

すべてのデータ メンバーをクラスまたは構造体に分離し、コピー間でこのデータを共有できます (参照カウントを使用)。データを変更するすべてのメソッドは、現在のオブジェクトが排他的なデータ所有者であることを確認するか、データのディープ コピーを作成する必要があります。

于 2013-04-13T17:34:35.547 に答える