当前位置:   article > 正文

【基础知识】深拷贝和浅拷贝_指针深拷贝

指针深拷贝

1. 深拷贝

        深拷贝是一种对象拷贝方式,它会创建一个新的对象,并将原始对象中的所有数据成员复制到新的对象中,包括多态分配内存。这意味着在深拷贝后,原始对象和新的对象是完全独立的,对一个对象的修改不会影响到另一个对象。深拷贝通常使用在涉及到动态分配内存的情况下,例如对象中包含指针或动态分配的数组等。

以下是一个深拷贝的示例:

  1. class MyString {
  2. public:
  3. // 构造函数
  4. MyString(const char* str) {
  5. size = strlen(str);
  6. data = new char[size + 1];
  7. strcpy(data, str);
  8. }
  9. // 拷贝构造函数,实现深拷贝
  10. MyString(const MyString& other) {
  11. size = other.size;
  12. data = new char[size + 1];
  13. strcpy(data, other.data);
  14. }
  15. private:
  16. int size;
  17. char* data;
  18. };

2. 浅拷贝

        浅拷贝是一种对象拷贝方式,它只是简单地将原始对象的内存内容按位复制到新的对象中,包括指针的复制,而不会创建新的内存空间。这意味着原始对象和新的对象会共享同一块内存,对一个对象的修改可能会影响到另一个对象。浅拷贝通常使用在对象中没有涉及到动态分配内存的情况下。

以下是浅拷贝的示例:

  1. class MyArray {
  2. public:
  3. // 构造函数
  4. MyArray(int size) {
  5. this->size = size;
  6. data = new int[size];
  7. }
  8. // 拷贝构造函数,实现浅拷贝
  9. MyArray(const MyArray& other) {
  10. size = other.size;
  11. data = other.data; // 浅拷贝,将指针复制给新对象
  12. }
  13. private:
  14. int size;
  15. int* data;
  16. };

        需要注意的是,如果一个类中包含了指针或者其他资源,需要谨慎处理对象的拷贝,以避免内存泄漏或者未定义行为。在实现类的拷贝构造函数和赋值操作符时,根据具体情况选择深拷贝还是浅拷贝,以确保对象拷贝行为的正确性和安全性。

3. 深拷贝和浅拷贝的区别

  • 对象中含有指针类型的成员变量时需要用深拷贝构造,否则用浅拷贝构造;
  • 编译器默认的拷贝构造函数是浅拷贝构造函数;
  • 如果对象中含有指针变量用了浅拷贝构造,那么会导致两个指针变量指向同一块地址空间,那么在对象释放时会导致一块空间释放两次;
  • 浅拷贝和深拷贝的区别在于,两个指针变量指向的是同一块空间还是指向不同的空间,如果没有创建内存的操作就是浅拷贝,否则就是深拷贝;
  • 深拷贝可以用于创建独立的副本,对于需要完全独立的对象的情况,比如在修改副本时不行影响原始对象的状态。而浅拷贝通常用于创建共享对象,当需要多个对象共享相同的数据时,可以使用浅拷贝来减少内存占用和提高性能。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号