私は次のコードを持っています:
#include <iostream>
#include <string>
#include <cstring>
struct test {
std::string name;
size_t id;
};
int main() {
test t;
t.name = "147.8.179.239";
t.id = 10;
char a[sizeof(t)] = "";
std::memcpy(a, &t, sizeof(t));
test b;
std::memcpy(&b, a, sizeof(t));
std::cout << b.name << " " << b.id << std::endl;
}
コンパイルして実行すると、次のエラーが発生します。
147.8.179.239 10
*** Error in `./test': double free or corruption (fasttop): 0x0000000000bf9c20 ***
Aborted (core dumped)
コードで結果を出力できることがわかりました。しかし、どうすればこのエラーを修正できますか?
現状を使用memcpy
することにより、std::string
まったく同じ2つのオブジェクトが得られます。これには、内部で使用する可能性のあるすべてのポインターが含まれます。したがって、各オブジェクトのデストラクタが実行されると、両方が同じポインタを解放しようとします。
これが、コピーコンストラクターを使用するか、一方を他方に割り当てる必要がある理由です(つまり、オーバーライドを使用しますoperator=
)。これらの実装の違いを認識し、正しく処理します。つまり、宛先オブジェクトに個別のメモリバッファを割り当てます。
に含まれる文字列を抽出する場合は、オブジェクトを既知の表現std::string
にシリアル化する必要があります。次に、それを逆シリアル化して元に戻すことができます。
std::string s1 = "hello";
printf("len=%zu, str=%s\n",s1.size(),s1.c_str());
// serialize
char *c = new char[s1.size()+1];
strcpy(c, s1.c_str());
printf("c=%s\n",c);
// deserialize
std::string s2 = c;
printf("len=%zu, str=%s\n",s2.size(),s2.c_str());
他のクラスオブジェクトに対しても同様の手順を実行します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加