C++下内存拷贝和=号操作符重载问题

gaochizhen33 2012-03-02 09:28:58

typedef struct ta_NE_INFO
{
int m_ia;
char m_strb[10];
ta_NE_INFO()
{
memset(this, 0, sizeof(ta_NE_INFO));
}
}NE_INFO;

class A
{
int m_iTemp;
NE_INFO m_strTemp;
};

有如上的两个声明,如果有A的两个对象 ,temp1为新声明的指针,temp2为一个指向A对象的指针并将操作符=重载

A *temp1 = new A;
(*temp1) = (*temp2);//方法一
memcpy(temp1, temp2, sizeof(A));//方法二


问题一:方法一和方法二能不能达到将temp2指向的对象的内容复制到temp1指向的对象中?是不是会造成浅拷贝?为什么用方法二会在析构的时候出现异常导致退出?
问题二:在=重载中,我没有对NE_INFO属性进行专门的复制操作,怎么内容也复制过去了呢?
问题三:在C++中,结构体复制=号需要重载么?还是可以直接用=进行复制。
...全文
176 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qscool1987 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 supermegaboy 的回复:]
问题一:方法一只要处理好深浅复制的问题,是安全的;但方法二是不安全的,即使对你的只有两个成员的例子而言,虽然没有虚函数、虚拟继承等东西,也无法保证安全,因为类对象的实现并没标准化,你不能假定实现者不会加入其他管理性的信息,直接memcopy可能会破坏了这些信息。

问题二:当没有自定义复制赋值操作符重载时,编译器会执行按位复制。

问题三:这无法一概而论,当按位复制不安全的时候,就需要自定……
[/Quote]
没什么好说的了,标准的解释
飞天御剑流 2012-03-02
  • 打赏
  • 举报
回复
问题一:方法一只要处理好深浅复制的问题,是安全的;但方法二是不安全的,即使对你的只有两个成员的例子而言,虽然没有虚函数、虚拟继承等东西,也无法保证安全,因为类对象的实现并没标准化,你不能假定实现者不会加入其他管理性的信息,直接memcopy可能会破坏了这些信息。

问题二:当没有自定义复制赋值操作符重载时,编译器会执行按位复制。

问题三:这无法一概而论,当按位复制不安全的时候,就需要自定义复制赋值操作符重载,但自定义复制赋值操作符重载又是影响性能的原因之一,这需要根据具体情况衡量。
gaochizhen33 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lanshaibaobei0820 的回复:]

方法二应该也是可行的,之所以在析构的时候回异常,肯定涉及到你没有在这里提及的一些逻辑。如果简单的如下面的程序
class A
{
int a;
char b[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
A *x = new A;
A *y = new A;
memcpy(x, y, sizeof(A));
delete x;……
[/Quote]
我觉得好像是造成了浅拷贝,然后有其中一个指针delete导致内存被释放了,造成使用另一个指针错误
lanshaibaobei0820 2012-03-02
  • 打赏
  • 举报
回复
方法二应该也是可行的,之所以在析构的时候回异常,肯定涉及到你没有在这里提及的一些逻辑。如果简单的如下面的程序
class A
{
int a;
char b[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
A *x = new A;
A *y = new A;
memcpy(x, y, sizeof(A));
delete x;
delete y;
return 0;
}
是不会异常的。
lanshaibaobei0820 2012-03-02
  • 打赏
  • 举报
回复
C++默认的赋值行为就是二进制拷贝,所以如果不是涉及到指针成员的所谓的深拷贝,楼主的方法一就是可行的。如果没有重载=,也会有默认的=实现,就是二进制拷贝。重载=是为了实现一些自定义的拷贝行为,所以不是必须重载=
恨天低 2012-03-02
  • 打赏
  • 举报
回复
自己重载下=运算符,定义拷贝构造函数吧。

64,649

社区成员

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

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