当前位置: 首页 > news >正文

Why delete[] array when deepcopying with “=“?

代码负责释放对象之前已经分配的资源,比如堆上的内存。在执行深拷贝之前,你需要确保对象不再引用之前的资源,以避免内存泄漏。通过删除先前的资源,你可以确保在进行深拷贝之前,已经释放了之前的资源,从而避免了资源泄漏。

当一个对象拥有动态分配的资源(比如堆上的内存),并且你希望将另一个对象的内容赋值给它时,你需要确保在赋值之前释放已经分配的资源,以避免内存泄漏。下面是一个具体的示例:

假设你有一个自定义的类 IntArray,它包含一个整数指针 array,用于存储动态分配的整数数组,以及一个整数 nElements,表示数组中的元素数量。你的类如下所示:

class IntArray {
private:int *array;int nElements;public:// 构造函数IntArray(int size) {nElements = size;array = new int[size];}// 析构函数~IntArray() {delete[] array;}// 赋值运算符重载IntArray &operator=(const IntArray &src) {if (this != &src) { // 防止无效的自我赋值delete[] array; // 释放现有资源deepCopy(src);  // 执行深拷贝}return *this;}// 深拷贝函数void deepCopy(const IntArray &src) {nElements = src.nElements;array = new int[nElements];for (int i = 0; i < nElements; ++i) {array[i] = src.array[i];}}// 其他方法和成员变量// ...
};

现在,考虑以下情况,你有两个 IntArray 对象 array1array2

IntArray array1(5); // 创建 array1,分配了一个包含5个整数的数组
IntArray array2(3); // 创建 array2,分配了一个包含3个整数的数组
array1 = array2; // 赋值操作

在这个赋值操作之前,array1 已经拥有了一个包含5个整数的数组,而 array2 拥有一个包含3个整数的数组。为了执行赋值操作,你需要确保在将 array2 的内容复制到 array1 之前,释放了 array1 之前分配的资源,以避免内存泄漏。

这就是为什么在赋值运算符重载函数中存在 delete[] array; 这行代码的原因。它的目的是在执行深拷贝之前释放 array1 的资源,然后再为 array1 分配新的资源,确保 array1array2 是独立的,不会导致内存泄漏。

在这段代码中,src&srcthisarray 分别指代以下内容:

  1. src:这是函数的参数,表示传递给赋值运算符重载函数的右操作数,即源对象。src 是一个 const IntArray & 类型的引用,表示它是一个 IntArray 类的对象的引用,该对象将用于赋值操作。

  2. &src:这是 src 的地址,表示源对象 src 在内存中的位置。& 运算符用于获取变量或对象的地址。在这里,它用于比较 thissrc 是否相同,以检查是否发生了自我赋值。

  3. this:这是指向当前对象的指针,即调用赋值运算符重载函数的对象的指针。在这个上下文中,this 表示正在执行赋值操作的目标对象,即接收赋值的对象。

  4. array:这是当前对象 this 中的成员变量,表示整数指针,用于存储动态分配的整数数组。delete[] array; 行代码用于释放当前对象 this 中的数组资源。

那为什么this对象可以跟地址比较?

`this` 指针是一个指向当前对象的指针,在 C++ 中,它是一个隐式参数,传递给成员函数以表示调用该函数的对象。因此,`this` 指针可以用于在成员函数内部访问对象的成员变量和方法。

在这段代码中,`this` 指针用于表示当前对象,而 `&src` 用于表示传递给赋值运算符重载函数的源对象 `src` 的地址。通过比较 `this` 和 `&src`,代码检查是否发生了自我赋值,即是否试图将对象赋值给它自己。

如果 `this` 和 `&src` 是相同的,这意味着赋值操作试图将对象赋值给它自己,这是一个无效的操作,可能会导致问题,因此需要避免。所以,通过比较 `this` 和 `&src`,可以防止自我赋值情况的发生。

那为啥不是this和src比较或者this→array和&src比较

 

在 C++ 中,`this` 是一个指向当前对象的指针,`src` 是一个表示传递给赋值运算符重载函数的源对象的引用。它们具有不同的类型和语义,因此不能直接进行比较。具体来说:

1. `this` 是一个指向当前对象的指针,类型为 `IntArray*`。它用于在成员函数内部访问对象的成员变量和方法。

2. `src` 是一个表示传递给赋值运算符重载函数的源对象的引用,类型为 `const IntArray&`。它是一个对象的别名,用于访问源对象的数据。

这两者之间的比较是没有意义的,因为它们代表了不同的概念和数据类型。在自我赋值检查中,我们关心的是比较当前对象和源对象是否是同一个对象。为了执行这个比较,我们使用 `this` 指针和 `&src`,因为它们分别表示当前对象和源对象在内存中的位置(地址),从而允许我们进行地址比较。

要比较对象的成员变量,你需要使用成员访问运算符 `.` 来访问对象的成员变量,例如 `this->array` 和 `src.array`。然而,这不会执行自我赋值检查,因为它只是比较成员变量的值,而不是对象的身份。在自我赋值检查中,我们关心的是对象的身份,即对象是否相同,因此需要比较它们的地址。

http://www.lryc.cn/news/218458.html

相关文章:

  • curl(六)DNS解析、认证、代理
  • (免费领源码)PHP#MySQL高校学生信息管理系统28099-计算机毕业设计项目选题推荐
  • [动态规划] (四) LeetCode 91.解码方法
  • Vue Vuex的使用和原理 专门解决共享数据的问题
  • 第九周实验记录
  • STM32WB55开发(6)----FUS更新
  • centos关闭Java进程的脚本
  • 深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现
  • Spring 中 BeanFactory 和 FactoryBean 有何区别?
  • 黑马程序员项目-黑马点评
  • ubuntu 20.04 + Anaconda + cuda-11.8 + opencv-4.8.0(cuda)
  • Linux 目录
  • Linux shell编程学习笔记21:用select in循环语句打造菜单
  • 线性回归与线性拟合的原理、推导与算法实现
  • 【C++】set和multiset
  • 二十、泛型(1)
  • 【Unity数据交互】游戏中常用到的Json序列化
  • TCP的滑动窗口和拥塞控制
  • 零信任网络:一种全新的网络安全架构
  • 基于单片机的智能拐杖软件设计
  • 小程序如何设置自动预约快递
  • STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)
  • 【数据结构】深入浅出讲解计数排序【图文详解,搞懂计数排序这一篇就够了】
  • Canvas制作喷泉效果示例
  • 什么是NPM(Node Package Manager)?它的作用是什么?
  • oracle如果不适用toad或者plsql工具如何获取索引建表语句
  • 某大厂伺服驱动器量产方案
  • 【计算机网络】网络层:数据平面
  • Path with “WEB-INF“ or “META-INF“: [webapp/WEB-INF/NewFile.html]
  • 百度OCR 接口调用 提示 216101:param image not exist 问题解决