《C++ Primer 第五版》不要返回局部對象的引用或指針

1. 先看一個“看似合理”的例子

#include <iostream>
using namespace std;int& foo() {int x = 10;      // 局部變量,存在于棧中return x;        // 返回它的引用
}int main() {int& ref = foo();  // ref 綁定到了已經被銷毀的 xcout << ref << endl; // 未定義行為
}

運行結果(可能不同機器表現不一樣):

  • 有的會輸出 垃圾值

  • 有的甚至會直接 程序崩潰


2. 為什么會這樣?

?核心原因局部變量的生命周期

  • 局部變量(如上例中的 x)存儲在 棧內存 上。

  • 當函數執行結束時,棧幀被銷毀,x 的內存就已經被回收。

  • 你返回它的引用/指針,本質上是讓外部去訪問“已經無效的內存”。

?這就是典型的 懸空引用 (dangling reference)懸空指針 (dangling pointer)


3. 直觀類比

想象一下,你去借朋友的房間(函數棧幀)里的一本書(局部變量)。

  • 當朋友的房間還存在時(函數運行中),你可以正常借用書。

  • 但是當房間被清空、收回時(函數返回后棧被銷毀),你手里的“地址”就指向了一個已經不存在的房間。

  • 你再去找那本書,不是 空房間,就是 放了別人東西的房間(被覆蓋為別的值)。

?所以結果要么是亂七八糟的值,要么是直接出錯。


4. 正確做法

那么我們要如何返回“安全”的引用或指針呢?

? 方法1:返回靜態局部變量的引用/指針

int& foo() {static int x = 10;  // 靜態局部變量,生命周期和程序一致return x;
}

?? 但要注意:static 意味著 所有調用共享同一個變量


? 方法2:在堆上分配,返回指針(外部負責釋放)

int* foo() {int* x = new int(10);  // 動態分配return x;              // 外部記得 delete
}

缺點是容易內存泄漏,C++更推薦用 智能指針


? 方法3:返回對象本身(值傳遞)

int foo() {int x = 10;return x;   // 返回的是值,而不是引用
}

這里不會有問題,因為編譯器會做 返回值優化 (RVO),性能很高。


? 方法4:傳入引用參數(推薦)

void foo(int &out) {out = 10;
}int main() {int val;foo(val);  // 安全,val 在 main 的作用域里cout << val << endl;
}

這樣數據的“所有權”明確歸調用者,避免懸空。


5. 總結口訣

局部變量在棧上,函數結束即銷毀;
別把引用/指針帶出去,否則就是懸空雷。


??所以,不要返回局部對象的引用或指針,因為函數返回后局部變量生命周期結束,引用/指針會指向無效內存,導致未定義行為。
而正確做法是:用 靜態局部變量堆分配值返回傳出參數

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

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

相關文章

2024鴻蒙樣題需要掌握的知識點

一、讀取json格式文件為對象或數組&#xff0c;顯示相應字段1、創建json文件的參數一致的類2、導入類、導入json文件3、循環渲染import router from ohos.router //導入即對象 import books from resources/rawfile/book1.json import { Book } from ../model/BookEntry Compon…

QML Charts組件之坐標軸示例

目錄引言&#x1f3af; 運行效果預覽&#x1f4da; 相關系列文章五種坐標軸詳解與代碼實踐1. 數值坐標軸&#xff08;ValueAxis&#xff09;示例代碼說明2. 對數坐標軸&#xff08;LogValueAxis&#xff09;示例代碼說明3. 日期坐標軸&#xff08;DateTimeAxis&#xff09;示例…

Vue3+ElementPlus倒計時示例

按鈕文字默認顯示“開始倒計時”當點擊按鈕時&#xff0c;顯示正在倒計時(倒計時數字)倒計時結束按鈕顯示“開始倒計時” 倒計時邏輯 Hooks 函數 hooks/useCountDown.js /*** hooks函數&#xff1a;函數是用于封裝和復用組件邏輯的一種機制* 定義&#xff1a;Hooks 是一種在不使…

docker 的網絡

1.查看docker里面的網絡docker network ls 2.查看某個 Docker 網絡的 網關 IP 和 子網段docker network inspect <網絡名或ID>

數據挖掘,到底是在挖掘什么?

&#x1f468;?&#x1f393;博主簡介 &#x1f3c5;CSDN博客專家 ??&#x1f3c5;云計算領域優質創作者 ??&#x1f3c5;華為云開發者社區專家博主 ??&#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社區&#xff1a;運維交流社區 歡迎大家的加入&#xff01…

【車載開發系列】CS+ for CC開發環境IDE

【車載開發系列】CS for CC開發環境IDE 【車載開發系列】CS for CC開發環境IDE【車載開發系列】CS for CC開發環境IDE一. 引言二. IDE安裝三. 新建工程四. 堆與棧內存的設置1&#xff09;棧內存設置2&#xff09;堆內存設置一. 引言 瑞薩單片機開發環境有三種&#xff1a;estu…

如何將視頻從安卓設備傳輸到Mac?

你是否想要創建備份、釋放存儲空間&#xff0c;或者分享難忘時刻&#xff1f;你可能想要輕松地將視頻從安卓設備復制到MacBook。在本篇關于“如何將視頻從安卓傳輸到Mac”的指南中&#xff0c;我們將介紹五種智能方法&#xff0c;幫助你無縫地復制視頻。從傳統的WiFi連接方法到…

MyBatis 初識:框架定位與核心原理——SQL 自由掌控的藝術

&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術 文章目錄&#x1f50d; MyBatis 初識&#xff1a;框架定位與核心原理——SQL 自由掌控的藝術&#x1f9e9; 一、為什么需要 ORM 框架&#xff1f;&#x1f4a1; JDBC 的痛點&#xff1a;原始時…

谷粒商城項目-P6環境-使用vagrant快速創建Linux虛擬機

1.虛擬機 虛擬機使用virtualbox,我使用的是6.0.12版本 2.創建linux系統 使用vagrant 驗證是否安裝完成vagrant 在cmd使用vagrant看看有沒有命令提示 創建虛擬機 在cmd使用vagrant init centos/7創建 創建完成后使用vagrant up啟動虛擬容器 啟動完成后&#xff0c;使用va…

人形機器人的“奧運會“:宇樹科技領跑,動捕技術成訓練關鍵

近年來&#xff0c;人工智能、仿生學和運動控制技術的突破性發展&#xff0c;正推動人形機器人成為全球科技競爭的新焦點。各國政府、科研機構和企業加速布局醫療、救援、服務等領域的應用場景。在此背景下&#xff0c;首屆世界人形機器人大會應運而生并于近日圓滿落幕。此次運…

20250823給榮品RD-RK3588開發板刷Rockchip原廠的Android14【EVB7的V10】時調通AP6275P的WIFI

20250823給榮品RD-RK3588開發板刷Rockchip原廠的Android14【EVB7的V10】時調通AP6275P的WIFI 2025/8/23 17:02【我是先將這個DTSI文件中的代碼塊直接搬到rk3588-evb7-lp4.dtsi中&#xff0c;然后就可以上網了。接著就微調到最終版本&#xff01;】 E:\RD-RK3588_Android13\kern…

Mac 菜單欄多合一工具自薦:FancyTool

鑒于本人特別喜歡花里花哨的菜單欄&#xff0c;但又不想開機自啟太多軟件&#xff0c;所以自己開發了一個新的、輕量的&#xff0c;有點花里胡哨但又有些實用功能的多合一工具&#xff1a;[ FancyTool ]&#xff0c; 感興趣的朋友可以點擊鏈接下載使用。 我承認&#xff0c;這…

用AI生成的一個BadgerDB的管理工具

badgerDB 是一款由 Dgraph Labs 開發的高性能、嵌入式鍵值&#xff08;Key-Value&#xff09;數據庫&#xff0c;基于 LSM-Tree&#xff08;Log-Structured Merge Tree&#xff09;存儲引擎設計&#xff0c;主打低延遲、高吞吐量和輕量級部署&#xff0c;廣泛用于需要本地持久化…

Spring-- Spring Security(一)

1. 概念Spring Security&#xff1a;Spring 提供的安全框架&#xff0c;用于保護應用程序免受未授權訪問&#xff0c;提供認證、授權、CSRF 防護等功能。核心功能&#xff1a;認證&#xff08;Authentication&#xff09;&#xff1a;確認用戶身份&#xff08;登錄過程&#xf…

某電器5G智慧工廠網絡建設全解析

隨著工業4.0的全面推進和智能制造需求的不斷增長&#xff0c;5G技術已成為智慧工廠建設的核心驅動力。某電器工廠計劃通過構建高效可靠的5G網絡&#xff0c;結合智能組網設備與工業物聯網技術&#xff0c;實現智能化轉型&#xff0c;提升生產運營效率。本文將詳細解析該5G智慧工…

PyCharm 加載不了 conda 虛擬環境,不存在的

#工作記錄前言在開發過程中&#xff0c;PyCharm 無法加載 Conda 虛擬環境是常見問題。在不同情況下&#xff0c;“Conda 可執行文件路徑”的指定可能會發生變化&#xff0c;不會一塵不變&#xff0c;需要靈活處置。以下是一系列解決此問題的經驗參考。檢查 Conda 安裝與環境創建…

xml中resultMap 的用法,數據庫 JSON 字符串 → Java List/對象

文章目錄一、resultMap 核心作用二、基本用法&#xff08;以你的配置為例&#xff09;1. 定義 resultMap2. 在 SQL 中使用 resultMap三、關鍵注意事項resultMap 是 MyBatis 中用于定義數據庫表字段與 Java 實體類屬性之間映射關系的核心配置&#xff0c;解決表字段名和實體類屬…

PySINDy

PySINDy A Python package for the Sparse Identification of Nonlinear Dynamics from Data Abstract PySINDy 是一個用于從數據中發現主導動力系統模型的 Python 軟件包。具體來說&#xff0c;PySINDy 提供了應用非線性動力學稀疏辨識&#xff08;SINDy&#xff09;[1] 方法…

校園跑腿小程序源碼 | 跑腿便利店小程序(源碼下載)

校園跑腿小程序源碼 | 跑腿便利店小程序 本項目后端采用 midway3.0&#xff0c;后臺采用 nuxt2.x,小程序采用 uniapp 實現的一套跑腿下單接單系統。 主要功能&#xff1a;跑腿、快遞代取、陪練陪玩、軟件安裝、申請接單、用戶下單、提現、物品重量計算等。 源碼下載&#xf…

基于stm32的物聯網OneNet火災報警系統

1 系統功能介紹 本設計為基于STM32單片機的物聯網OneNet火災報警系統。系統通過采集環境中的溫濕度、火焰檢測數據&#xff0c;并結合物聯網技術上傳至OneNet云平臺&#xff0c;實現遠程監控和報警功能。系統還具備蜂鳴器報警、LED燈閃爍等本地報警功能&#xff0c;保證在火災發…