请教结构体的复制memcpy函数问题

Jayson_Gao 2012-10-04 10:22:02
memcpy函数在对结构体两个对象进行复制的时候出现问题如下:


两个结构体对象a,b都是结构体数组

其中a是已知,b未知

然后用memcpy进行复制


memcpy(&b,&a,sizeof(a));

之后对a进行插入处理,结果为a插入了一个数,b不变;

如果对b进行插入也是正常的;

但是如果对a或者b的任何一个进行删除就会使得另外一个也被删除,但是主动删除的长度变短,不是主动删除的那个长度不变,只是最后一个位置的被重复了。

请大牛们帮忙解答,对于memcpy复制函数具体原理我不懂所以请教,再请问如何才能复制之后两个对象的内存不会相互影响。
...全文
3238 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
audi2 2012-10-10
  • 打赏
  • 举报
回复
请问数组怎么“插入”?
Jayson_Gao 2012-10-08
  • 打赏
  • 举报
回复
特别感谢你,你说的意思我很明白,应该写个拷贝函数。[Quote=引用 2 楼 的回复:]

不是很明白你的意思。
你说的结构体,是指c语言的那种传统结构体,还是C++的类对象

memcpy只是单纯把 指定的开始位置的指定内存长度 拷贝到 指定目标位置。

如果你结构体里有指针什么的, 那个指针就变成共享的。
#也就是指针所指向的 堆内存 是不会拷贝的。

如果这样的话,你只能给类写一个拷贝构造函数了
或者重载一个 赋值操作符=
[/Quote]
Jayson_Gao 2012-10-08
  • 打赏
  • 举报
回复
谢谢你了,这里高手真的不少![Quote=引用楼主 的回复:]
memcpy函数在对结构体两个对象进行复制的时候出现问题如下:


两个结构体对象a,b都是结构体数组

其中a是已知,b未知

然后用memcpy进行复制


memcpy(&b,&a,sizeof(a));

之后对a进行插入处理,结果为a插入了一个数,b不变;

如果对b进行插入也是正常的;

但是如果对a或者b的任何一个进行删除就会使得另外一……
[/Quote]
IVERS0N 2012-10-08
  • 打赏
  • 举报
回复
C++ 要考虑很多 不能直接使用memcpy
Jayson_Gao 2012-10-08
  • 打赏
  • 举报
回复
嗯,谢谢你。是很容易溢出,唉语言没学好,现在痛苦啊~[Quote=引用 6 楼 的回复:]

c还是c++,如果是c++,还是忘了struct和memcpy吧

即便是c,memcpy(&b,&a,sizeof(a))也是不对的,这样很容易有缓冲区溢出
[/Quote]
Jayson_Gao 2012-10-08
  • 打赏
  • 举报
回复
朋友,首先我谢谢你帮忙。你说的这两个问题真的是很严重,你说的对,我还是不能用memcpy。必须自己写个拷贝函数了。我不用类,只用结构体拷贝函数差不多吧!
[Quote=引用 5 楼 的回复:]

这个程序有两个主要问题:

1 b未知,如果sizeof(a)>sizeof(b)怎么办?这将带来毁灭性的冲击(就像你的程序出现的奇怪现象,或者更厉害一些的crash)。

2 如果不是1那样的情况,a和b是否是pod(plain old data)?pod是c++用来兼容c struct的一个概念。C++ standard对pod进行了细致的描述,可以查阅。同时memcpy是C fun……
[/Quote]
一叶之舟 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
楼主自己google “深拷贝 浅拷贝”
另外,忘了memcpy这货吧,真的。
[/Quote]
memcpy是用来复制内存的不是用来复制对象的。
alan1985 2012-10-08
  • 打赏
  • 举报
回复
c还是c++,如果是c++,还是忘了struct和memcpy吧

即便是c,memcpy(&b,&a,sizeof(a))也是不对的,这样很容易有缓冲区溢出
popy007 2012-10-08
  • 打赏
  • 举报
回复
这个程序有两个主要问题:

1 b未知,如果sizeof(a)>sizeof(b)怎么办?这将带来毁灭性的冲击(就像你的程序出现的奇怪现象,或者更厉害一些的crash)。

2 如果不是1那样的情况,a和b是否是pod(plain old data)?pod是c++用来兼容c struct的一个概念。C++ standard对pod进行了细致的描述,可以查阅。同时memcpy是C function,用来处理连续内存空间拷贝。非pod class object因为可能存储了virtual机制、不能被共享的指针等,memcpy会破坏这些数据的正确性,导致了virtual机制被破坏(大灾难),指针被重复释放等等这些问题。因此,memcpy只能用于pod。

对于你的情况,上面的朋友提到了,copy-constructor和copy assignment operator才是C++的“标准做法”。
relaxisland 2012-10-04
  • 打赏
  • 举报
回复
不是很明白你的意思。
你说的结构体,是指c语言的那种传统结构体,还是C++的类对象

memcpy只是单纯把 指定的开始位置的指定内存长度 拷贝到 指定目标位置。

如果你结构体里有指针什么的, 那个指针就变成共享的。
#也就是指针所指向的 堆内存 是不会拷贝的。

如果这样的话,你只能给类写一个拷贝构造函数了
或者重载一个 赋值操作符=
taodm 2012-10-04
  • 打赏
  • 举报
回复
楼主自己google “深拷贝 浅拷贝”
另外,忘了memcpy这货吧,真的。

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧