首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

请教结构体的复制memcpy函数问题
memcpy函数在对结构体两个对象进行复制的时候出现问题如下:


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

其中a是已知,b未知

然后用memcpy进行复制


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

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

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

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

请大牛们帮忙解答,对于memcpy复制函数具体原理我不懂所以请教,再请问如何才能复制之后两个对象的内存不会相互影响。

[解决办法]
楼主自己google “深拷贝 浅拷贝”
另外,忘了memcpy这货吧,真的。

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

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

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

如果这样的话,你只能给类写一个拷贝构造函数了
或者重载一个 赋值操作符=

[解决办法]
这个程序有两个主要问题:

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++的“标准做法”。
[解决办法]
c还是c++,如果是c++,还是忘了struct和memcpy吧

即便是c,memcpy(&b,&a,sizeof(a))也是不对的,这样很容易有缓冲区溢出
[解决办法]

探讨
楼主自己google “深拷贝 浅拷贝”
另外,忘了memcpy这货吧,真的。

[解决办法]
C++ 要考虑很多 不能直接使用memcpy

热点排行