本文主要是介绍深浅拷贝区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误。
深拷贝:
#include <iostream>
#include <cstring> // For memcpyclass MyObject {
private:int* data;size_t size;public:MyObject(size_t s) : size(s) {data = new int[size];std::cout << "Constructor called" << std::endl;}// 拷贝构造函数MyObject(const MyObject& other) : size(other.size) {data = new int[size];// 深拷贝数据memcpy(data, other.data, size * sizeof(int));std::cout << "Copy constructor called" << std::endl;}// 赋值运算符重载MyObject& operator=(const MyObject& other) {if (this != &other) { // 避免自我赋值delete[] data; // 删除原来的数据size = other.size;data = new int[size];// 深拷贝数据memcpy(data, other.data, size * sizeof(int));std::cout << "Assignment operator called" << std::endl;}return *this;}// 析构函数~MyObject() {delete[] data; // 释放动态分配的内存std::cout << "Destructor called" << std::endl;}// 用于输出对象内容的函数void printData() const {for (size_t i = 0; i < size; ++i) {std::cout << data[i] << " ";}std::cout << std::endl;}
};int main() {// 创建对象MyObject obj1(5);obj1.printData(); // 输出原始对象内容// 深拷贝对象MyObject obj2 = obj1;obj2.printData(); // 输出深拷贝后对象的内容return 0;
}
C++标准库中哪里用了深拷贝
STL的容器包括string,vector,map等。还有智能指针包括等。
unique_ptr如何实现深拷贝?
std::unique_ptr<int> ptr1 = std::make_unique<int>(42);
std::unique_ptr<int> ptr2 = std::move(ptr1); // 使用移动语义
这篇关于深浅拷贝区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!