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

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

2012-04-14 
C++下内存拷贝和号操作符重载问题C/C++ codetypedef struct ta_NE_INFO{intm_iachar m_strb[10]ta_NE_I

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

C/C++ code
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对象的指针并将操作符=重载
C/C++ code
A *temp1 = new A;(*temp1) = (*temp2);//方法一memcpy(temp1, temp2, sizeof(A));//方法二


问题一:方法一和方法二能不能达到将temp2指向的对象的内容复制到temp1指向的对象中?是不是会造成浅拷贝?为什么用方法二会在析构的时候出现异常导致退出?
问题二:在=重载中,我没有对NE_INFO属性进行专门的复制操作,怎么内容也复制过去了呢?
问题三:在C++中,结构体复制=号需要重载么?还是可以直接用=进行复制。

[解决办法]
C++默认的赋值行为就是二进制拷贝,所以如果不是涉及到指针成员的所谓的深拷贝,楼主的方法一就是可行的。如果没有重载=,也会有默认的=实现,就是二进制拷贝。重载=是为了实现一些自定义的拷贝行为,所以不是必须重载=
[解决办法]
方法二应该也是可行的,之所以在析构的时候回异常,肯定涉及到你没有在这里提及的一些逻辑。如果简单的如下面的程序
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;
}
是不会异常的。
[解决办法]
问题一:方法一只要处理好深浅复制的问题,是安全的;但方法二是不安全的,即使对你的只有两个成员的例子而言,虽然没有虚函数、虚拟继承等东西,也无法保证安全,因为类对象的实现并没标准化,你不能假定实现者不会加入其他管理性的信息,直接memcopy可能会破坏了这些信息。

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

问题三:这无法一概而论,当按位复制不安全的时候,就需要自定义复制赋值操作符重载,但自定义复制赋值操作符重载又是影响性能的原因之一,这需要根据具体情况衡量。

热点排行