在operator =中要處理“自我賦值”

?

防止自我賦值很有必要

Widget w;
w = w;
a[i] = a[j]; //a[i]和a[j]實際上指向同一個元素
*pi = *pj; //pi和pj實際上指向同一個元素

自我賦值的危害

Widget
{
private:Test *p;
};
Widget &Widget::operator=(const Widget &w)
{delete p;p = new int (*w.p);return *this;
}

如果是自我賦值,會把自己的空間釋放掉,即當執行delete p后,w.p已經指向一個被釋放的內存空間(此時*w.p的內容未知);當執行 p = new int(*w.p);即讓p重新指向一個存儲了(*w.p)的內存空間,該內存空間內容又是未知的。當再次引用時,會出現未定義的行為。

改良版本

Widget &Widget::operator=(const Widget &w)
{if (this == &w){return *this;}delete p;p = new Test(*w.p);return *this;
};

這個類雖然能避免自我賦值的問題,但是,如果new Test時拋出異常,那么Widget最終會持有一個指針指向一塊被刪除的內存區域,這樣的指針是有害的。

改成這樣

Widget &Widget::operator=(const Widget &rhs)
{Test *porg = p;p = new Test(*rhs.p);delete porg;return *this;
}

此時new Test發生異常,那么p可以保持原狀。(異常發生的時候,不會給p賦值)

delete prog;保證了p原來指向的內存空間也會被順利釋放。

轉載于:https://www.cnblogs.com/codingmengmeng/p/9065280.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251717.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新添加磁盤分區后,找不到新分區

問題:在Vcent中擴容磁盤容量,登錄虛擬機fdisk /dev/sda分區后,找不到新分區。 lsblk或者 df -TH fdisk /dev/sda p 嘗試解決辦法: cd /sys/class/scsi_host/ ls echo "- - -" > /sys/class/scsi_host/host0/scan (中…

Linux一些指令

備忘。。 ~/.bashrc 環境變量文件 xshell5 與本機文件傳輸 rz接受 sz filename 傳輸 watch -n 2 nvidia-smi 監視gpu 狀態wget 下載單個文件wget http://images.cocodataset.org/zips/train2014.zip給.sh文件添加x執行權限 比如以hello.sh文件為例,chmod ux hello…

C# 通過反射獲取方法/類上的自定義特性

1.所有自定義屬性都必須繼承System.Attribute 2.自定義屬性的類名稱必須為 XXXXAttribute 即是已Attribute結尾 自定義屬性QuickWebApi [AttributeUsage(AttributeTargets.Method, Inherited false, AllowMultiple true)]public class QuickWebApiAttribute: Attribute{publ…

Spring Cloud Zuul網關(快速搭建)

zuul 是netflix開源的一個API Gateway 服務器, 本質上是一個web servlet應用。 在云平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。相當于是設備和 Netflix 流應用的 Web 網站后端所有請求的前門。主要功能是路由轉發和過濾器。 Zuul可…

10.13 上午 考試

T1 直接二分就好了 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <cstdlib> #include <algorithm> #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) using namespace std;ll n; in…

前端安全之token

前端可以通過cookie以js的方式存取token&#xff0c;并且實現用戶的登錄登出以及token的超時操作&#xff0c;但這樣做并不安全&#xff0c;無法避免跨站腳本的攻擊&#xff0c;如果對項目的安全性要求比較高&#xff0c;應該在服務端開啟http only為true&#xff0c;通過服務端…

gbk 轉 UTF-8

iconv命令 gbk 轉 UTF-8 -----linux gbk 轉 UTF-8-------- iconv 用法 iconv -f "gbk" -t "utf-8" < infile > outfile 或者 piconv -f "gbk" -t "utf-8" < infile > outfile iconv -f utf-8 -t GBK 123456.txt 對傳文件…

Mybatis中輸入輸出映射和動態Sql

一、輸入映射我們通過配置parameterType的值來指定輸入參數的類型&#xff0c;這些類型可以是簡單數據類型、POJO、HashMap等數據類型1、簡單類型2、POJO包裝類型①這是單表查詢的時候傳入的POJO包裝類型&#xff0c;即可以直接傳入實體類&#xff0c;但是當多表查詢的時候&…

css純字母或者字母換行顯示

white-space:normal; word-break:break-all;轉載于:https://www.cnblogs.com/mmykdbc/p/7661009.html

javascript使用btoa和atob來進行Base64轉碼和解碼

javascript中如何使用Base64轉碼 let str javascript;let btoaStr window.btoa(str); //轉碼結果 amF2YXNjcmlwdAconsole.log(btoaStr);console.log(window.atob(btoaStr)); //解碼結果 javascriptBase64轉碼的對象只能是字符串, var str "China&#xff0c;中國"…

珠寶條碼打印掃描解決方案

隨著人們生活水平的逐步提高&#xff0c;珠寶消費日益增長&#xff0c;據統計&#xff0c;我國珠寶首飾零售規模超過7000億&#xff0c;過去5年復合增長為15%&#xff0c;是規模增長最為迅速的可選消費品類之一。面對千億級的消費市場&#xff0c;珠寶行業競爭激烈&#xff0c;…

課程作業1

1使用組合數公式利用n!來計算 a.設計思想 定義n和k&#xff0c;用遞歸函數表示出N!的階乘結果&#xff0c;c(n,k)n!/(k!(n-k)!);調用函數求出c(n,k)的結果 b.源代碼 package kecheng1; import java.util.Scanner; public class Test {public static void main(String[] args) {…

新手學Python推薦的四本書籍+2個資源網站

2019獨角獸企業重金招聘Python工程師標準>>> 很多伙伴初學Python&#xff0c;會問到&#xff1a;有沒有好的學習書籍推薦&#xff1f;有沒有好的學習網站推薦&#xff1f; 針對這類伙伴的問題&#xff0c;小優給大家整理了學習Python的四本書籍2個資源網站&#xff…

【轉】Linux系統編程---dup和dup2詳解

正常的文件描述符&#xff1a; 在linux下&#xff0c;通過open打開以文件后&#xff0c;會返回一個文件描述符&#xff0c;文件描述符會指向一個文件表&#xff0c;文件表中的節點指針會指向節點表。看下圖&#xff1a; 打開文件的內核數據結構 dup和dup2兩個函數都可以用來復制…

Android Activity標簽屬性

Android Activity標簽屬性 Activity 是 Android 系統四大應用組件之一&#xff0c;用戶可與 Activity 提供的屏幕進行交互&#xff0c;以執行撥打電話、拍攝照片、發送電子郵件等操作開發者必須在清單文件中聲明要使用的 Activity&#xff0c;這樣系統才能訪問它。聲明方式是在…

Java -----JVM運行時數據區

一、JVM體系結構 想要了解運行時數據區&#xff0c;先關注一下JVM的體系結構&#xff0c;知道數據區在JVM的整體位置和作用。 二、JVM運行時數據區 1.程序計數器 一塊較小的內存空間&#xff0c;它是當前線程所執行的字節碼的行號指示器&#xff0c;字節碼解釋器工作時通過改變…

20155235 《網絡攻防》 實驗八 Web基礎

20155235 《網絡攻防》 實驗八 Web基礎 實驗內容 Web前端HTML(0.5分) 能正常安裝、啟停Apache。理解HTML&#xff0c;理解表單&#xff0c;理解GET與POST方法,編寫一個含有表單的HTML。Web前端javascipt(0.5分) 理解JavaScript的基本功能&#xff0c;理解DOM。編寫JavaScript驗…

python每天1道面試題(3)--字符串組合

""" 題目3&#xff1a;輸入一個字符串&#xff0c;輸出該字符串中字符的所有組合。舉個例子&#xff0c;如果輸入abc&#xff0c;它的組合有a、b、c、ab、ac、bc、abc。解題思路: 先用列舉法,舉例出組合元素長度分別是1,2,..,len(str)時的具體元素, 然后發現當數…

【每周一圖】蜂鳥

攝影/祈澈姑娘小花園偶遇的一只蜂鳥轉載于:https://www.cnblogs.com/wangting888/p/9702088.html

API網關如何實現對服務下線實時感知

上篇文章《Eureka 緩存機制》介紹了Eureka的緩存機制&#xff0c;相信大家對Eureka 有了進一步的了解&#xff0c;本文將詳細介紹API網關如何實現服務下線的實時感知。 一、前言 在基于云的微服務應用中&#xff0c;服務實例的網絡位置都是動態分配的。而且由于自動伸縮、故障和…