请教结构体的复制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))也是不对的,这样很容易有缓冲区溢出
[解决办法]