cpp拷贝类和清空结构体导致的程序运行崩溃

⌚Time: 2024-05-27 17:17:00

👨‍💻Author: Jack Ge

我使用new来创建一个对象,使用memcpy拷贝一个源对象的数据到这个对象。

...
//新建对象
ClassA* ca = new ClassA;
//cs是源对象,直接用memcpy拷贝
memcpy(ca,cs,sizeof(ClassA));

之后这个拷贝的对象被销毁。等我再次拷贝源对象。发现使用拷贝后的对象时崩溃。

我最后发现问题再模板库queue上面,原来是这个对象类里面有queue。直接使用memcpy导致拷贝后的对象queue与源对象的指向的地址相同,之后随着拷贝后的对象释放后一起被销毁了。之后再进行拷贝,对象里面得到的就是被销毁了的queue,自然是无法使用的。导致了崩溃

为了避免这个问题,我使用下面的办法就能够实现拷贝。他不会拷贝queue的地址,就不会导致崩溃。

ClassA* ca = new ClassA;
*ca = *cs;

与之类似的问题是使用memset清空结构体是我犯得错误。这个结构体里面有map,使用memset导致map地址也被清空,之后会无法正确使用这个结构体。

总结:

在类和结构体里面有标准模板库(STL)时,要注意拷贝和清空的操作。不能直接用内存操作函数来拷贝和清零操作。

有些类似深拷贝与浅拷贝的道理,这里的操作只需要用到浅拷贝,但是直接使用内存操作函数拷贝直接连指针地址也拷贝了,导致了拷贝后的对象修改影响了原对象的内容。关于深拷贝与浅拷贝,我问了inscodeai

在C++中,拷贝一个对象可以分为深拷贝和浅拷贝。

深拷贝(Deep Copy)是指在拷贝对象时,不仅会复制对象的值,还会复制对象指向的资源。这意味着在深拷贝中,会分配新的内存空间来存储拷贝对象的资源。修改拷贝对象的资源不会影响原对象的资源。

浅拷贝(Shallow Copy)是指在拷贝对象时,只复制对象的值,而不会复制对象指向的资源。这意味着在浅拷贝中,拷贝对象和原对象会共享同一份资源。修改拷贝对象的资源会影响原对象的资源。

一般情况下,C++类的对象拷贝使用的是浅拷贝。当一个对象中包含指针类型的成员变量时,需要注意拷贝的方式,避免浅拷贝带来的问题。如果需要实现深拷贝,可以通过自定义拷贝构造函数和拷贝赋值操作符来实现。