精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ 內(nèi)存管理的隱形殺手:為什么資深開發(fā)者從不在 STL 容器中存放裸指針!

開發(fā)
今天我們探討了 C++ 中值語(yǔ)義與引用語(yǔ)義的區(qū)別,以及 STL 容器存儲(chǔ)指針的隱患。但這只是 C++ 編程道路上的一個(gè)小坑而已。?

大家好!我是小康。

今天咱們來聊一個(gè)看似簡(jiǎn)單卻常常讓 C++ 新手(甚至老手)踩坑的話題 —— 值語(yǔ)義與引用語(yǔ)義,以及為什么在 STL 容器中存指針可能會(huì)給你帶來意想不到的麻煩。

一、從一個(gè)"驚悚"的bug說起

小張最近寫了一段代碼,他想用一個(gè) vector 存儲(chǔ)一些學(xué)生信息:

#include <iostream>
#include <vector>
#include <string>

class Student {
public:
    Student(conststd::string& name, int age) : name_(name), age_(age) {
        std::cout << "創(chuàng)建了一個(gè)學(xué)生: " << name_ << std::endl;
    }
    
    ~Student() {
        std::cout << "銷毀了一個(gè)學(xué)生: " << name_ << std::endl;
    }
    
    void introduce() {
        std::cout << "我是" << name_ << ",今年" << age_ << "歲。" << std::endl;
    }
    
private:
    std::string name_;
    int age_;
};

int main() {
    std::vector<Student*> students;
    
    // 創(chuàng)建學(xué)生并存入vector
    Student* xiaoming = new Student("小明", 18);
    Student* xiaohong = new Student("小紅", 19);
    
    students.push_back(xiaoming);
    students.push_back(xiaohong);
    
    // 使用學(xué)生信息
    for (auto student : students) {
        student->introduce();
    }
    
    // 程序結(jié)束
    return0;
}

小張得意洋洋地運(yùn)行代碼,沒想到發(fā)現(xiàn)一個(gè)令人震驚的事實(shí):學(xué)生對(duì)象居然沒有被銷毀!

控制臺(tái)輸出:

創(chuàng)建了一個(gè)學(xué)生: 小明
創(chuàng)建了一個(gè)學(xué)生: 小紅
我是小明,今年18歲。
我是小紅,今年19歲。

"咦?銷毀信息呢?"小張撓撓頭,"難道是我的析構(gòu)函數(shù)寫錯(cuò)了?"

二、值語(yǔ)義 vs 引用語(yǔ)義:兩種思維方式

要理解這個(gè)問題,首先我們需要了解 C++ 中的兩種核心語(yǔ)義:值語(yǔ)義和引用語(yǔ)義。

1. 值語(yǔ)義:復(fù)制就是全新的"克隆"

簡(jiǎn)單來說,值語(yǔ)義就是"拷貝即復(fù)制"。當(dāng)你把一個(gè)變量賦值給另一個(gè)變量時(shí),你實(shí)際上是創(chuàng)建了一個(gè)全新的、獨(dú)立的副本。

舉個(gè)生活中的例子:你拿著一張照片,去復(fù)印店復(fù)印了一份。現(xiàn)在你有兩張完全一樣的照片,但它們是兩個(gè)獨(dú)立的物體。你在一張上畫個(gè)胡子,另一張并不會(huì)受影響。

C++中的基本類型(int、double等)和標(biāo)準(zhǔn)庫(kù)中的大多數(shù)類(如string、vector)都遵循值語(yǔ)義:

std::string name1 = "John";
std::string name2 = name1;  // name2是name1的完整副本

name2[0] = 'T';  // 修改name2不會(huì)影響name1
std::cout << name1 << std::endl;  // 輸出"John"
std::cout << name2 << std::endl;  // 輸出"Tohn"

2. 引用語(yǔ)義:多個(gè)"遙控器"控制同一個(gè)電視

引用語(yǔ)義則是"拷貝即引用"。當(dāng)你把一個(gè)變量賦值給另一個(gè)變量時(shí),你實(shí)際上只是創(chuàng)建了一個(gè)"引用"或"指針",兩個(gè)變量指向同一個(gè)對(duì)象。

生活中的例子:你家的電視遙控器。家里可能有好幾個(gè)遙控器(客廳一個(gè),臥室一個(gè)),但它們控制的是同一臺(tái)電視。用任何一個(gè)遙控器更改頻道,電視都會(huì)響應(yīng)。

C++中,指針和引用就遵循引用語(yǔ)義:

int num = 10;
int* p1 = #
int* p2 = p1;  // p2和p1指向同一個(gè)整數(shù)

*p2 = 20;  // 通過p2修改值
std::cout << num << std::endl;  // 輸出20,原始值已被修改
std::cout << *p1 << std::endl;  // 輸出20,p1看到的也是修改后的值

三、STL容器:值語(yǔ)義的忠實(shí)擁護(hù)者

C++的 STL 容器(如vector、list、map等)都是值語(yǔ)義的堅(jiān)定支持者。這意味著:

  • 當(dāng)你把對(duì)象放入容器時(shí),容器會(huì)創(chuàng)建該對(duì)象的副本
  • 當(dāng)容器被銷毀時(shí),它會(huì)負(fù)責(zé)銷毀它所包含的所有對(duì)象

這種設(shè)計(jì)有很多好處,最重要的是:容器完全擁有并管理它的元素,不依賴外部資源。這讓內(nèi)存管理變得簡(jiǎn)單而安全。

那么問題來了,為什么小張的代碼出問題了?

四、"定時(shí)炸彈":在 STL 容器中存儲(chǔ)指針

回到小張的代碼,他是這樣定義 vector 的:

std::vector<Student*> students;

這里,vector存儲(chǔ)的是什么?是 Student 指針,而不是 Student 對(duì)象本身!

當(dāng) vector 被銷毀時(shí),它確實(shí)盡職盡責(zé)地"銷毀"了它的元素——但這些元素是指針,銷毀指針只是釋放指針變量本身占用的那一小塊內(nèi)存,而不會(huì)對(duì)指針?biāo)赶虻膶?duì)象做任何事情。

這就像你扔掉了電視遙控器,但電視機(jī)本身還開著——這就是內(nèi)存泄漏!

五、解決方案:STL容器存指針的正確姿勢(shì)

如果你真的需要在 STL 容器中存儲(chǔ)指針(有時(shí)候確實(shí)需要這樣做),有幾種解決方案:

1. 手動(dòng)管理內(nèi)存(不推薦)

// 記得手動(dòng)刪除
for (auto student : students) {
    delete student;  // 手動(dòng)釋放內(nèi)存
}
students.clear();  // 清空容器

這種方法很容易出錯(cuò),特別是代碼復(fù)雜或有異常拋出時(shí),很可能漏掉某些刪除操作。

2. 使用智能指針(推薦)

#include <memory>
std::vector<std::unique_ptr<Student>> students;

// 創(chuàng)建并存儲(chǔ)
students.push_back(std::make_unique<Student>("小明", 18));
students.push_back(std::make_unique<Student>("小紅", 19));

// 不需要手動(dòng)管理內(nèi)存!當(dāng)vector銷毀或元素被移除時(shí),unique_ptr會(huì)自動(dòng)刪除指向的學(xué)生對(duì)象

智能指針(如shared_ptr、unique_ptr)會(huì)在不再需要時(shí)自動(dòng)釋放它們所擁有的對(duì)象,大大減少了內(nèi)存泄漏的風(fēng)險(xiǎn)。

不過,使用shared_ptr也要當(dāng)心幾個(gè)小坑:比如兩個(gè)對(duì)象互相持有對(duì)方的shared_ptr會(huì)造成循環(huán)引用,導(dǎo)致它們永遠(yuǎn)不會(huì)被釋放;另外shared_ptr的引用計(jì)數(shù)管理也有一定性能開銷。如果對(duì)象只需要單一所有權(quán)(就像我們這個(gè)例子),其實(shí)用unique_ptr會(huì)更輕量更合適哦!

3. 最簡(jiǎn)單的方案:直接存儲(chǔ)對(duì)象而非指針

std::vector<Student> students;  // 直接存儲(chǔ)Student對(duì)象

// 創(chuàng)建并存儲(chǔ)
students.emplace_back("小明", 18);  // 使用emplace_back直接在容器中構(gòu)造對(duì)象
students.emplace_back("小紅", 19);

// vector會(huì)自動(dòng)管理對(duì)象的生命周期

這是最簡(jiǎn)單也是最符合 C++ 思想的方式——除非你有特殊理由,否則應(yīng)該優(yōu)先考慮這種方式。

六、值語(yǔ)義的威力:為什么 C++ 如此重視它

為什么 C++ 的標(biāo)準(zhǔn)庫(kù)如此堅(jiān)持值語(yǔ)義?因?yàn)橹嫡Z(yǔ)義有幾個(gè)巨大的優(yōu)勢(shì):

  • 所有權(quán)明確:對(duì)象的所有權(quán)非常清晰,誰(shuí)創(chuàng)建誰(shuí)負(fù)責(zé)。
  • 生命周期簡(jiǎn)單:對(duì)象的生命周期與包含它的容器綁定,容易理解和管理。
  • 代碼可靠性:減少了懸掛指針和內(nèi)存泄漏的風(fēng)險(xiǎn)。

七、真實(shí)項(xiàng)目中的指針坑

我在一個(gè)實(shí)際項(xiàng)目中曾看到過這樣的代碼:

class ResourceManager {
private:
    std::vector<Resource*> resources_;
public:
    ~ResourceManager() {
        // 糟糕!忘記釋放resources_中的資源了
    }
};

這導(dǎo)致了嚴(yán)重的內(nèi)存泄漏,因?yàn)槊看蝿?chuàng)建和銷毀 ResourceManager 時(shí),它所管理的資源都沒有被正確釋放。

修復(fù)后的版本使用了智能指針:

class ResourceManager {
private:
    std::vector<std::unique_ptr<Resource>> resources_;
public:
    // 不需要自定義析構(gòu)函數(shù)!unique_ptr會(huì)自動(dòng)處理資源的釋放
};

八、總結(jié):到底該不該在 STL 容器中存指針?

說了這么多,那到底該不該在 STL 容器中存指針呢?我給大家一個(gè)簡(jiǎn)單的決策樹:

(1) 能直接存對(duì)象就直接存對(duì)象。這是最安全、最簡(jiǎn)單的方式。

(2) 如果必須用指針(比如需要多態(tài)或?qū)ο蠛艽蟛贿m合復(fù)制),優(yōu)先用智能指針:

  • 如果對(duì)象只屬于容器,用unique_ptr
  • 如果對(duì)象需要在多個(gè)地方共享,用shared_ptr(小心循環(huán)引用)

(3) 裸指針是最后的選擇,只有當(dāng)你確定對(duì)象的生命周期比容器長(zhǎng),或者對(duì)象由其他機(jī)制管理時(shí)才考慮。

記住一個(gè)原則:誰(shuí)創(chuàng)建,誰(shuí)負(fù)責(zé)銷毀。如果你往容器里塞了裸指針,就得記得手動(dòng)釋放它們。

就這么簡(jiǎn)單!

責(zé)任編輯:趙寧寧 來源: 跟著小康學(xué)編程
相關(guān)推薦

2025-03-06 08:30:00

C++開發(fā)vector

2025-08-05 08:25:04

2018-03-23 08:31:36

2025-10-11 02:00:00

代碼審查命名格式

2024-03-01 16:43:48

C++11智能指針內(nèi)存

2024-01-09 09:23:12

指針C++

2025-02-17 08:10:00

C++代碼lambda

2013-03-28 19:25:35

騰訊云

2025-05-06 07:24:24

2011-04-11 11:09:50

this指針

2015-07-29 09:53:57

前端開發(fā)總結(jié)

2024-03-01 12:03:00

AI模型

2013-09-05 11:04:53

C++開發(fā)者

2012-12-26 09:51:52

C++開發(fā)者C++ CX

2024-10-06 13:47:43

后端開發(fā)者項(xiàng)目

2010-07-29 10:16:17

Linux內(nèi)核Linux內(nèi)存

2010-01-26 13:42:28

C++指針

2013-04-25 10:14:39

Facebook開發(fā)者開發(fā)

2024-12-26 10:45:08

2023-09-20 15:02:56

Java編程語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产成人啪精品午夜在线观看| 成人免费a级片| 精品视频一二三区| 亚洲精彩视频| 日韩国产在线看| 亚洲天堂网一区| 污污片在线免费视频| 久久综合九色综合97婷婷女人| 国产精品永久免费| 日韩三级免费看| 99精品美女| www.久久久久久久久| 国产精品国产三级国产aⅴ浪潮| 午夜爱爱毛片xxxx视频免费看| 久久伊人影院| 欧美在线观看一二区| 欧美中文字幕在线观看视频 | 精品对白一区国产伦| 亚洲精品怡红院| 久草在线视频福利| 中文字幕视频一区二区三区久| 久久99精品久久久久久秒播放器| 国产成人精品白浆久久69| 快she精品国产999| 国内精品视频久久| www.超碰在线观看| 99久久.com| 亚洲无亚洲人成网站77777| 国产精品偷伦视频免费观看了| 成人在线高清| 在线观看91视频| 国产免费一区二区三区视频| 免费在线看电影| 亚洲丝袜自拍清纯另类| 亚洲精品国产精品国自产观看| 香蕉久久国产av一区二区| 国产成人午夜视频| 91久久精品美女高潮| 久久国产香蕉视频| 久久在线91| 日本亚洲欧美三级| 草久久免费视频| 亚洲国内欧美| 91禁外国网站| 久草国产精品视频| 亚洲伦理一区| 4p变态网欧美系列| 久久久久久少妇| 日韩亚洲精品在线| 91成品人片a无限观看| 国产精品不卡av| 在线欧美不卡| 97在线视频免费播放| 免费无码毛片一区二区app| 欧美+日本+国产+在线a∨观看| 久久艹在线视频| 日本免费网站视频| 天天精品视频| 欧美黄色片在线观看| 久久久久久福利| 在线成人黄色| 日本韩国欧美精品大片卡二| 9i精品福利一区二区三区| 视频一区二区三区入口| 国产成人精品亚洲精品| 一级欧美一级日韩| 国内不卡的二区三区中文字幕 | 青青视频一区二区| 亚洲女成人图区| 久久久免费看片| 中文精品电影| 国内精品视频一区| 国产裸体美女永久免费无遮挡| 久久精品国产精品亚洲综合| 91综合免费在线| 色噜噜在线播放| 久久久久久久免费视频了| 麻豆91精品91久久久的内涵| 久久69精品久久久久久国产越南| 精品肉丝脚一区二区三区| 日韩视频三区| 国产成人中文字幕| 国产精品无码白浆高潮| 成人夜色视频网站在线观看| 欧美日韩无遮挡| 在线看福利影| 国产精品自拍av| 粉嫩av免费一区二区三区| 天堂视频中文在线| 国产精品久久久久影院| 国产乱淫av片杨贵妃| 日韩欧美看国产| 欧美一区二区在线免费播放| 黄色短视频在线观看| 999国产精品999久久久久久| 97超碰色婷婷| 国产理论视频在线观看| 99热99精品| 亚洲日本精品国产第一区| heyzo中文字幕在线| 欧洲人成人精品| 中国黄色片视频| 日韩免费视频| 91精品国产91| 国产成人精品一区二区无码呦| 2020国产精品| 久青草视频在线播放| 97精品国产99久久久久久免费| 精品国产一区二区亚洲人成毛片| 91视频免费在观看| 99精品热视频只有精品10| 成人h猎奇视频网站| 完全免费av在线播放| 国产精品高清在线观看| 秋霞欧美在线观看| 亚洲男帅同性gay1069| 青青在线免费观看视频| 国产精品国精产品一二| 日本欧美一二三区| 91免费在线看片| 国产日韩精品视频一区二区三区| 91精品国产自产在线观看永久| 天堂а√在线8种子蜜桃视频 | 成人在线观看www| 精品成人av| 亚洲精品视频在线播放| 国产无码精品在线播放| 国产乱人伦偷精品视频不卡| 亚洲精品在线观看免费| 欧美日韩大片| 精品亚洲一区二区| 国产一级做a爱片久久毛片a| 成人精品视频一区二区三区| 影音先锋男人在线| 成人在线视频你懂的| 日韩有码在线视频| 久久久久精彩视频| 26uuu另类欧美| 日本午夜激情视频| 亚洲成人黄色| 久久影院资源网| 91丨porny丨在线中文 | 精品999日本| 国产精品免费久久久久久| 亚洲人视频在线观看| 成人av网址在线| 97在线观看免费| 丰满人妻一区二区三区免费| 亚洲日本韩国一区| 欧美日本一区二区| 亚洲精品国产精品久久| 欧美18av| 亚洲视频在线看| 国产欧美精品一区| 九九久久久久久久久激情| 国产精华7777777| 亚洲天堂电影网| 97免费观看视频| 国产精品丝袜一区| 亚洲精品自拍网| 日韩一区二区在线| 成人av色在线观看| 成人影院在线看| 成人短视频软件网站大全app| 成人aaaa免费全部观看| 日本黄网站色大片免费观看| 中文字幕成人| 欧美成人手机在线| www视频在线| 91官网在线| 欧美日韩国产综合新一区| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 国产精品一区二区在线免费观看| 狠狠色狠狠色综合日日tαg| 国产激情一区二区三区在线观看 | 伊人影院在线视频| 欧美精品一区二区在线观看| 手机看片久久久| 国产精品理论片| 成年女人免费视频| 久久久夜精品| 成年人视频大全| 台湾亚洲精品一区二区tv| 国产精品色午夜在线观看| 日本色护士高潮视频在线观看| 亚洲伦理中文字幕| 97人妻精品一区二区三区视频| 亚洲午夜激情av| 国产传媒在线看| 国产91精品露脸国语对白| 久久综合久久色| 欧美在线资源| 水蜜桃亚洲一二三四在线| 成人线上播放| 成人h视频在线观看播放| 久草在线资源福利站| xx视频.9999.com| 污视频在线免费观看| 欧美日韩精品高清| 国产又爽又黄的视频| 中文字幕不卡的av| 手机在线看片日韩| 黄色日韩网站视频| 日本成人在线免费视频| 欧美日本一区| 一区二区免费电影| 一区二区导航| 国产九色精品| 国产情侣一区在线| 国产精品久久色| 亚洲人成午夜免电影费观看| 欧美精品免费看| 毛片在线播放a| 国产一区二区三区在线视频| 香港三日本三级少妇66| 欧美xxx久久| 国产熟女一区二区丰满| 欧美日韩一区二区三区视频| 中文字幕在线观看视频网站| 一区二区免费看| 久久久久久视频| 国产精品久久久久久久久晋中| 日本高清www| 91丨九色丨蝌蚪富婆spa| 精品人妻一区二区免费| 国产一区二区三区日韩 | 欧洲精品久久久久毛片完整版| 欧美在线一区二区三区四| av资源在线| 韩国三级电影久久久久久| 欧美野外wwwxxx| 欧美成在线视频| 哥也色在线视频| 日韩在线观看免费高清| 日本a在线播放| www.欧美三级电影.com| 中文字幕在线免费| 中文字幕日韩精品在线| 欧美三级电影一区二区三区| 社区色欧美激情 | 免费av网站在线看| 中文字幕在线视频日韩| 91av资源在线| 日韩一区二区av| 黄色片网站在线| 欧美日韩成人一区| 国产精品无码粉嫩小泬| 欧美日韩国产高清一区二区三区| 国产精品无码一区| 美女国产一区二区三区| 亚洲色图第一页| 天堂成人在线| 亚洲系列中文字幕| 午夜精品一区| 欧美成人精品一区| 日本高清在线观看视频| 欧美极品美女视频网站在线观看免费| 国产盗摄精品一区二区酒店| 国内精久久久久久久久久人| 末成年女av片一区二区下载| 日本中文字幕不卡免费| 蜜桃精品在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美午夜在线| 精品国产一二三四区| 日韩精品亚洲一区| 五月天中文字幕在线| 国产激情一区二区三区四区| 中文字幕精品久久久| 国产无一区二区| 久久国产波多野结衣| 亚洲国产va精品久久久不卡综合| 久久国产黄色片| 欧美日韩一级二级三级| 亚洲精品国产一区二| 日韩精品久久久久久久玫瑰园| 丁香在线视频| 九九精品视频在线| 小视频免费在线观看| 成人久久久久爱| 理论片一区二区在线| 亚洲精品9999| 亚洲国产免费| 天天干天天玩天天操| www.久久精品| chinese全程对白| 欧美日韩亚洲激情| 国产又粗又长视频| 日韩精品福利在线| gogo在线观看| 国产精品成人观看视频国产奇米| 日韩精品视频一区二区三区| 欧美激情一区二区三区在线视频| 日韩精品一卡| 97国产精东麻豆人妻电影| 精品一区二区影视| 久久久久久久久久久国产精品| 亚洲色图在线播放| 国产免费一区二区三区四区五区 | 中文字幕一二三区| 国产亚洲精品福利| 日韩精品视频免费播放| 欧美日韩国产欧美日美国产精品| 亚洲欧美另类综合| 日韩中文字幕av| 伊人网在线播放| 成人18视频| 91精品久久久久久久蜜月| 成人一区二区三| 成人性视频网站| 欧美人禽zoz0强交| 久久全国免费视频| 酒色婷婷桃色成人免费av网| 美女视频久久黄| 91p九色成人| 久久精品国产第一区二区三区最新章节 | 国产精品亚洲天堂| 丝袜国产日韩另类美女| 成人免费无码大片a毛片| 亚洲最新视频在线观看| 91亚洲欧美激情| 影音先锋日韩有码| 亚洲天堂av在线| 国产偷久久久精品专区| 欧美精品二区| 肉色超薄丝袜脚交| 最好看的中文字幕久久| 中国a一片一级一片| 亚洲欧美在线磁力| 国产精欧美一区二区三区蓝颜男同| 国产成人av一区二区三区| 欧美黄污视频| 91av免费观看| 亚洲自拍偷拍欧美| 亚洲精品国产suv一区| 欧美成人性生活| 国产精品亚洲欧美一级在线| 一区二区三区在线观看www| 日本大胆欧美人术艺术动态| 国产成人福利在线| 欧美在线视频全部完| 国产69精品久久app免费版| 国产精品欧美一区二区三区奶水| 国产调教一区二区三区| 91国产精品视频在线观看| 中文av字幕一区| 91av久久久| 美女扒开尿口让男人操亚洲视频网站| 成人噜噜噜噜| 国产一二三区在线播放| 成人精品国产一区二区4080| 日韩欧美自拍偷拍| 国产特黄在线| 国产精品一区二区性色av | av不卡一区| 国产精品自拍片| 久久久久国产一区二区三区四区| 欧美性猛交bbbbb精品| 国产亚洲精品久久久| 欧美一级做a| 国产小视频免费| 成人一区二区三区视频| 国产一级精品视频| 国产亚洲欧洲高清| 日本成人一区二区| 久草视频这里只有精品| 久久午夜羞羞影院免费观看| 中文字幕av网站| 欧美精品制服第一页| 久久久久观看| 亚洲国产精品三区| 一区二区三区欧美久久| 日韩在线观看视频一区二区三区| 欧美性在线观看| 欧美激情黄色片| 精人妻一区二区三区| 色婷婷亚洲综合| 天堂地址在线www| 国产欧美日韩在线播放| 丝袜a∨在线一区二区三区不卡| 成年人一级黄色片| 日韩av在线一区| 国产精品亚洲欧美一级在线| 夫妻免费无码v看片| 日韩一区欧美一区| 神马亚洲视频| 91在线色戒在线| 久久午夜影视| 久久免费播放视频| 中文字幕亚洲欧美在线| 国产极品模特精品一二| a在线观看免费视频| 亚洲a一区二区| 麻豆视频在线| 区一区二区三区中文字幕| 粉嫩av一区二区三区在线播放| 五月婷婷六月婷婷| 97精品在线视频| 中文字幕一区二区精品区| 中文字幕被公侵犯的漂亮人妻|