• 5389阅读
  • 5回复

关于std::string [复制链接]

上一主题 下一主题
离线yleesun
 

只看楼主 倒序阅读 楼主  发表于: 2011-08-26
我在使用string时,遇到以下问题
我声明一个结构体,如下:
struct A
{
   int id;
   string name;
};

A a;
a.id = 9;
a.name = "tom";
想把该结构体内容拷贝到char* buff中,用memcpy(buff,&a,sizeof(a)),并把buff通过tcp发送到服务器,在服务器端接收到后,再拷贝回A类型的结构体中如下:
A b;
memcpy(&b,buff,sizeof(b));


在此过程中,如果a.name长度小于16,结果与期望一致,但是如果a.name的长度大于16,则出现问题,通过调试发现再把buff中的内容拷贝回b,过程中,出现内存不可读,程序崩溃。


请问各位大侠,这是什么回事?
离线dbzhang800

只看该作者 1楼 发表于: 2011-08-26
不过长度小于16时,能不出问题,还是蛮神奇的。

不妨先搞清楚这种语句在做什么吧。

memcpy(buff,&a,sizeof(a))
离线yleesun

只看该作者 2楼 发表于: 2011-08-26
不过长度小于16时,能不出问题,还是蛮神奇的。是的,就是不明白为什么会这样。通过深拷贝,不出问题。
离线a418877216

只看该作者 3楼 发表于: 2011-08-26
通过深拷贝,不出问题。
离线gloriacnb

只看该作者 4楼 发表于: 2011-09-14
疑点有两个,我现在想到的,
第一 你的 buff是否已经分配内存?如果只是声明 char* buff,然后就memcpy,那保不齐就内存出错了。
第二 在string的构造上,服务器端只是一个对Struct A 的实例化,但A所包含的string对象name并未正确初始化,在A的实例b创建的同时,编译器自动调用了string的默认构造函数,你的编译器正好给这个string默认分配了16个字节的空间。 所以b只有16字节可用,memcpy的时候就溢出了~

明白了吗?解决的方法我初步想到为Struct A 的构造函数增加对string对象的构造,并且给string对象一个足够用的空间,比如32个字节。

struct A
{
   A() : name(32, 'x') {}; //用32个字符x初始化name。
    int id;
   string name;
};

青衫磊落险峰行
离线gloriacnb

只看该作者 5楼 发表于: 2011-09-14
sorry,我在我的编译器上实验了一下,应该不是我说的string未正确初始化的问题,因为你在服务器端上执行的是 memcpy(&b, buff, sizeof(b)),拷贝结束是以 sizeof(b)为条件的,不会溢出。

而且你也明确说了是内存读错误,所以严重怀疑buff的空间分配
青衫磊落险峰行
快速回复
限100 字节
 
上一个 下一个