python字典 直接赋值 copy deepcopy
dict2 = dict1 #对象的引用
dict2 = dict1.copy() #浅拷贝 拷贝一级对象,但是如果字典里有个列表,改变dict1中这个列表的值的时候,dict2相应改变,可以自己递归实现深拷贝
import copy
dict2 = copy.deepcopy(dict1)#深拷贝所有级别的对象都拷贝
浅拷贝只拷贝父对象的意思
a = {1: [1,2,3]}
b = a.copy() #a, b分别为({1: [1, 2, 3]}, {1: [1, 2, 3]})
a[1].append(4) #a, b分别为({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
OpenCV mat 直接赋值//Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区
cv::Mat image;
cv::Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区
cv::Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区
cv::Mat image1 = image.clone() ;//深拷贝,把image中的所有信息拷贝到image1中
cv::Mat image1;
image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)
//注意 cv::Mat 作为函数参数,无论写不写& ,看似传值或者传引用这种方式,原图都会发生改变,不使用clone或者copyto或者手动赋值,都不是深拷贝,都共享数据区
c++ 拷贝构造函数的浅拷贝和深拷贝
c++中类对象的默认拷贝构造函数是浅拷贝,类a=类b,两个类的成员变量指向同一块内存,如果类b析构了之后,类a的成员变量还指向原来那块内存,就会有野指针的问题,会出错。
想要深拷贝,应该自己自定义拷贝构造函数,为对应的成员变量开辟新空间。这才是好的编程习惯。
//深拷贝的例子
class Example{
public:
Example(int num, char* str) {
num_ = num;
str_ = new char[num];
strcpy(str_, str);
}
Example(const Example& e) {
num_ = e.num;
str_ = new char(num_);
if(str_ != 0)
strcpy(str_, e.str);
}
~Example(){
delete str_;
}
private:
int num_;
char* str_;
}