0
struct Property 
{
    int objID;
    const char* objName;
};


struct Data
{
    Property propertyRef;
}

std::vector<Data> items;

ここで、次のようにデータを割り当てている関数の1つ

Data d1;
d1.propertyRef.objID = 1;
d1.propertyRef.objName = "MyObj";

//... I am some logic in between and passing this d2 which is mentioned below to another thread in argument

Data d2 = d1;

問題は、印刷d2.propertyRef.objNameするとジャンク値が印刷されることですか?

ここでのポイントは、ライブラリを使用していて、ライブラリを変更して演算子 = をデータに追加できないことです。

この問題に直面している理由と解決方法を教えてください。(私はそれをグーグルで検索し、ディープコピーする必要があると述べましたが、ベクターでそれを行う方法がわかりません.

4

4 に答える 4

3

使用std::string:

std::string objName;   

これで、ディープ コピーのジョブが実行されます。もう心配する必要はありません。

また、一般的に、std::string素晴らしいです、あなたはそれを気に入るはずです. char*またはconst char*(原則として)必要な場合に使用します 。

于 2012-07-16T12:55:02.387 に答える
0

データを埋め込み、データ/プロパティに代わって三つのルールを実装する新しいクラスDataRefを作成できます。次に、ベクターでDataRefを使用します。

于 2012-07-16T12:57:48.667 に答える
0

a の代わりに aPropertyを使用するように変更できれば、すべてが機能します。std::stringconst char*

できない場合は、コピー ctor/assign 演算子を提供できるDataクラスでラップし、そのベクトルを格納します。

于 2012-07-16T12:55:56.110 に答える
0

まず、表示されているコードのビットについては、浅いコピーが機能するはずです。文字列リテラルを指している限り、objName問題はありません。

が他のものを指し始めた場合objNameは、割り当てだけでなく、作成などのために、それを管理するための特別な関数が必要になる可能性があります。この時点で、ラッパー クラスが必要になります。ただし、最初に、それが必要であることを確認します。Data変更できない外部ライブラリにあると言うので、これについてもいくつかの制約がある可能性があります。(ライブラリは内部的にコピーしますData か? もしそうなら、渡す文字列の存続期間を何らかの方法で保証する必要があります。)

于 2012-07-16T13:20:17.923 に答える