0

ポインター項目のベクトルのコピーに問題があるかどうかお聞きしたいです。深度コピーの問題がある可能性があるため、strcpy または memcpy が必要ですか?

例えば:

Class B;

Class A

{
   ....

private:
   std::vector<B*> bvec;

public:

   void setB(std::vector<B*>& value)

   {

      this->bvec = value;

   }

};

void main()

{

   ....

   std::vector<const B*> value; // and already has values

   A a;

   a.setB(value);

}

この例では、A クラス内のクラス変数 bvec にのみ値を割り当てます。std::vector bvec; が見つかったので、memcpy を使用する必要がありますか? ポインター項目がありますか? C++ の深度コピーと混同しています。それについて教えていただけますか? ありがとうございました。

4

3 に答える 3

2

これについて考えてみてください。呼び出しvalue た後にベクターからアイテムを削除して削除すると、setBのベクターにAは無効になったポインターが含まれます。

したがって、「ディープコピー」を実行するか、上記のシナリオが発生しないことを保証するか、std::shared_ptr生のポインターの代わりにのような共有スマートポインターを使用する必要があります。ポインタが必要な場合は、最後をお勧めします。

別の方法があります。それはA、実際のベクトルへの参照としてベクトルを格納することです。ただし、これには他の問題があります。たとえば、実際のベクトルはオブジェクトの存続期間を通じて有効である必要があります。ただし、ここでもスマートポインターを使用して、ベクトルを動的に割り当てることができます。

于 2012-08-15T03:59:17.957 に答える
1

問題を解決するためにstrcpyまたはmemcpyが必要になることはほとんどありません。しかし、あなたの問題が何であるかはわかりません。

std::vectorに関連するコピーについて説明します。

setBの値にbvevを割り当てると、ディープコピーが作成されます。これは、ベクトル内のすべての要素がvalueからbvecにコピーされることを意味します。オブジェクトのベクトルがある場合は、各オブジェクトがコピーされます。ポインターのベクトルがある場合は、各ポインターがコピーされます。

もう1つのオプションは、後で要素を参照する場合は、ポインタをベクトルにコピーすることです。寿命を適切に管理するように注意してください!

お役に立てば幸いです。

于 2012-08-15T03:59:58.350 に答える
1

class Aおそらく、あなたが尋ねている問題が正しく処理されることを保証するために、コピー コンストラクターを定義したいと思うでしょう(ただし、 memcpyorを使用することではありませんstrcpy)。ここでは常に 3 つのルールに従います。私はstd::vectorあなたの良いと確信していますが、そうでない場合は、for代わりにループを使用してくださいmemcpy

于 2012-08-15T04:17:09.967 に答える