0

私は私のObjクラスでこのようなことをしようとしています:

public:
    template <typename T>
    Obj(T & o) {
        siz = sizeof(o);

        p = malloc(siz);
        memcpy(p, &o, siz);
    }   
private:                                
    void * p;
    size_t siz;

私がこのようなことをするなら、それはうまくいきます:

string str = "foobar";
Obj u = Obj(str);

しかし、私がこのようなことをした場合はそうではありません:

Obj u = Obj(string("foobar"));

その結果、文字列はランダムな文字で埋められます。

私が使用する文字列を取得するには:

string S() {
    return *((string *)p);
}

何か案が?

4

2 に答える 2

2

他の人がコメントしているように、このようなことをするべきではありません。あなたが示したコード例は、POD (http://stackoverflow.com/questions/146452/what-are-pod-types-in-c) 以外では機能しません。memcpy を実行すると、新しいオブジェクトが正しく初期化されていない可能性があります。たとえば、ポインターであるメンバーがある場合。文字列の場合、その実装は、元の文字列が所有する文字バッファーへのポインターを保持している可能性があります。元の文字列が削除されると、文字バッファーも削除されます。ただし、me​​mcopyed オブジェクトは削除されたバッファを指し続けます。

于 2012-09-26T23:02:20.817 に答える
1

さて、あなたが何をしようとしているのかを推測するのは非常に困難です。

あなたがしているように見えるのは、オブジェクトのバイナリコピーを作成することです。これは、すべての悪と悪の深刻なケースです。最初のケースでは、これを「実際の」オブジェクトに対して行っているため、元のオブジェクト (str オブジェクト) がまだ存在しているため、機能しているように見える可能性があります。そのため、コピーに含まれるポインターは依然として「有効な」データを指しています。2番目のケースでは、事の直後に解放される一時オブジェクトに対してそれを行っています。これがおそらく、「コピー」にガベージしかない理由です。

いずれにせよ、見た目からして、どちらも実際にはまったく合理的なことをしていません。あなたの最初の例はうまくいくように見えるだけだと思います。

于 2012-09-26T23:01:15.630 に答える