Code Bye

在C++中用memcpy复制类出错

#include<iostream>
using namespace std;
class B
{
public:int num = 0;
B() {};
B(int a)
{
num = a;
}
};
class A
{
int i = 0;
public:B* p = new B[1];
void create(int n)
{
i++;
B* q = new B[i];
memcpy(q, p, sizeof(p));
delete[] p;
p = new B[i + 1];
memcpy(p, q, sizeof(q));
p[i] = n;
delete[] q;
};
void show(B* b)
{
for (int j = 1; j <= i; j++)
cout << (b + 1)->num << ” “;
}
};
int main()
{
A a;
int i = 0;
cin >> i;
a.create(i);
a.create(3);
a.create(4);
a.create(5);
a.create(6);
a.show(a.p);
return 0;
}
输出前几个是0 最后一个6
每次赋值都会正确的赋给p,然后memcpy到q就变成0了。
顺便问一下,用Dev和VS 单步调试 都看不到memcpy怎么工作的啊……
本人感觉这个问题是本人对memcpy的理解有误 但是还是不知道是什么
解决方案

15

引用:

memcpy(q, p, sizeof(p));仅仅是拷贝了两个指针值

q = p完全相同的效果
这样子试试
B* q = new B[i + 1];
memcpy(q, b, sizeof(B)*i);
q[i++] = n;
delete [] p;
p = q;

q = p 应该和 memcpy(&q, &p, sizeof(p)) 是一样的。
题主需要的八成是相似 memcpy(q, p, sizeof(*p)*i); 的东西。

5

cout<<(b+1)->num<<’’;
b的值是0x003D6C10,该地址的内容如下

所以b+1应该是2所在的数据,而(b+1)->num的值是2中前两个字节,均为0。
假如你的程序改为
cout<<(b+j)->num<<’’;
则输出5个值,分别是第2-6所在的区域的前两个字节的数据,所以最后一个输出是6,其它的都是0。
另外两个有可能出现错误的地方
B* p = new B[1];
这里是用new来分配了一个B的数组,该数组中的元素个数是1,此时调用的是B的默认构造函数,而不是B(int a)
考虑是不是修改成
B* p = new B(1);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在C++中用memcpy复制类出错