c – 使用memcpy复制对象时,双重释放或损坏错误

我有如下代码
#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对象.这包括他们可能在内部使用的任何指针.所以当每个对象的析构函数运行时,它们都试图释放相同的指针.

这就是为什么您需要使用复制构造函数或将另一个赋值给另一个(即使用覆盖的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,s2.size(),s2.c_str());

您将对其他类对象执行类似的步骤.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...