精品欧美一区二区三区在线观看 _久久久久国色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)

国产精品996| 福利小视频在线观看| 天天综合亚洲| 日韩亚洲欧美高清| 拔插拔插海外华人免费| 人妻一区二区三区| 国产精品亚洲综合色区韩国| 亚洲人成网站色ww在线| 亚洲最大成人在线观看| 超碰在线观看免费| 99久久精品费精品国产一区二区| 欧美自拍视频在线观看| 1024手机在线观看你懂的| 精品一区二区三区视频在线播放| 亚洲国产精品一区二区久久| 亚洲a一级视频| 国产免费美女视频| 好吊妞视频这里有精品| 日韩欧美精品网址| 在线观看亚洲视频啊啊啊啊| 亚洲精品国产手机| 日韩和欧美一区二区| 久久国产精品亚洲| 中文字幕一区二区三区人妻| 亚洲视频自拍| 日韩欧美在线字幕| 天堂av免费看| 天天干天天干天天干| 日韩国产在线观看一区| 欧美激情视频在线观看| 黄色av网址在线观看| 青娱乐极品盛宴一区二区| 天天爽夜夜爽夜夜爽精品视频| 一区二区不卡在线| 天天综合在线视频| 国产一区二区三区四区五区入口| 庆余年2免费日韩剧观看大牛| 一区二区三区四区五区| 国产精品中文字幕亚洲欧美| 欧美第一区第二区| jizzzz日本| 91精品论坛| 一区二区三区中文字幕电影| 亚洲国产精品久久久久婷婷老年 | 亚洲久久久久| 亚洲天堂2020| 国产又黄又粗又猛又爽的视频 | 影音先锋中文字幕一区| 日韩在线中文视频| 完美搭档在线观看| 蜜桃精品一区二区三区| 欧美亚洲综合在线| 国产成人无码一二三区视频| 美女精品导航| 亚洲欧洲99久久| 区一区二区三区中文字幕| 国内爆初菊对白视频| 国产一区91精品张津瑜| 国产男女猛烈无遮挡91| 九九热最新视频| 国产女优一区| 777777777亚洲妇女| 免费在线一区二区三区| 欧美日韩精品免费观看视频完整| 日韩在线免费视频观看| 少妇精品无码一区二区免费视频| 免费看成人哺乳视频网站| 亚洲护士老师的毛茸茸最新章节| 爱豆国产剧免费观看大全剧苏畅| 久久99国产精品二区高清软件| 一本久久精品一区二区| 精品欧美一区免费观看α√| 蜜桃麻豆av在线| 精品久久久一区二区| 国产真人做爰毛片视频直播| 国产在线xxx| 亚洲3atv精品一区二区三区| 成人在线观看你懂的| 成人爽a毛片免费啪啪动漫| 亚洲综合图片区| 免费av手机在线观看| 天堂av在线| 亚洲风情在线资源站| 日韩欧美国产综合在线| 欧美gv在线观看| 日本道精品一区二区三区| 精品国产成人av在线免| 黑人一区二区三区| 91精品国产乱码久久蜜臀| 久久久久亚洲av片无码v| 日韩在线亚洲| 亚洲精品不卡在线| 极品蜜桃臀肥臀-x88av| 99成人超碰| 欧美国产极速在线| 国产高清中文字幕| 视频在线观看一区| 91精品久久久久久久久久久久久久| 亚洲一线在线观看| 国产精品一区二区果冻传媒| 波多野结衣一区二区三区在线观看| 色婷婷视频在线| 国产午夜久久久久| 日本一道在线观看| 一区二区乱码| 777久久久精品| 黄色国产在线视频| 欧美手机在线| 欧美日本精品在线| 日韩综合在线观看| 国产精品自拍三区| 欧美lavv| a视频在线观看| 午夜精品一区在线观看| 337p粉嫩大胆噜噜噜鲁| 日本免费成人| 日韩第一页在线| 在线日韩国产网站| 亚洲精选久久| 成人性生交xxxxx网站| 香蕉视频免费在线看| 国产精品国产三级国产aⅴ中文| 成人av在线不卡| 精品123区| 欧美一区二区三区不卡| 在线免费观看成年人视频| www.国产一区二区| 免费日韩中文字幕| 亚洲aⅴ男人的天堂在线观看| 制服丝袜亚洲精品中文字幕| 久久人人爽人人爽人人av| 成人欧美magnet| 欧美午夜电影网| 扒开伸进免费视频| 999精品视频| 国产成人一区二区三区电影| 少妇荡乳情欲办公室456视频| 国产精品免费视频观看| 成人免费在线小视频| 一区二区三区免费在线看| 中文字幕精品一区久久久久| 久久久久亚洲av成人片| 日韩国产高清在线| 久久久久免费网| 国产精品一区hongkong| 91精品国产综合久久精品| a级在线观看视频| 午夜视频精品| 国产精品一区二区久久久久| 亚洲欧洲精品视频| 亚洲摸摸操操av| 欧美wwwwwww| 曰本一区二区三区视频| 久久99国产综合精品女同| 激情网站在线观看| 久久久久久夜精品精品免费| 男人日女人bb视频| 国偷自产av一区二区三区| 欧美国产精品人人做人人爱| 国产精品无码AV| 亚洲欧洲成人自拍| 午夜一区二区视频| 婷婷亚洲最大| 成人黄色片在线| 久操视频在线| 在线成人高清不卡| 波多野结衣喷潮| 日韩二区三区四区| 色综合久久88色综合天天提莫| 成人爱爱网址| 亚洲情综合五月天| 最近国语视频在线观看免费播放| 久久久国产午夜精品| 亚欧在线免费观看| 久久性感美女视频| 成人免费在线网址| 香蕉久久aⅴ一区二区三区| 日韩免费在线观看| 妺妺窝人体色www聚色窝仙踪| 国产宾馆实践打屁股91| 精品成在人线av无码免费看| 欧美黑白配在线| 国产成一区二区| 国产综合在线观看| 欧美日韩一区三区四区| 亚洲二区在线播放| 成人综合婷婷国产精品久久蜜臀| 91丨porny丨探花| 精品国产视频| 国产日韩精品一区二区| 污片视频在线免费观看| 亚洲精品国精品久久99热| 中文字幕亚洲乱码熟女1区2区| 久久精品在线观看| 国产永久免费网站| 99精品国产一区二区青青牛奶 | 岛国在线视频网站| 国产亚洲精品va在线观看| 亚洲综合网av| 亚洲高清免费视频| 一本加勒比北条麻妃| 美女爽到高潮91| 免费高清一区二区三区| 国产欧美日韩| 999热视频| 在线观看的黄色| 久久婷婷国产麻豆91天堂| 日韩一级中文字幕| 欧美日本一区二区在线观看| 久久久久成人精品无码| 国产欧美精品在线观看| 激情小说欧美色图| 日本一不卡视频| av片在线免费| 久久婷婷蜜乳一本欲蜜臀| 国产综合 伊人色| 男女啪啪999亚洲精品| 97精品一区二区视频在线观看| 成人高潮成人免费观看| 精品日韩成人av| 亚洲综合精品视频| 日韩欧美精品网址| 国产一级二级三级| 国产精品国产精品国产专区不蜜| 又黄又爽的网站| 男女激情视频一区| 91视频 -- 69xx| 欧美69wwwcom| 四虎永久在线精品免费一区二区| 亚洲图色一区二区三区| 日韩女在线观看| av中文在线资源库| 久久久精品美女| 亚洲日本在线播放| 欧美成人欧美edvon| 亚洲天天综合网| 91国产成人在线| 国产精品午夜影院| 亚洲va韩国va欧美va| 国产jizz18女人高潮| 久久亚洲二区三区| 国产精品福利导航| 精品一区二区精品| 性欧美极品xxxx欧美一区二区| 国产专区一区| 日本xxx免费| 日韩www.| 亚洲精品乱码久久久久久蜜桃91| 久久99国产精一区二区三区| 精品久久久久久乱码天堂| youjizz欧美| 91丨九色丨国产| 精品国模一区二区三区欧美 | 日韩不卡免费高清视频| 国产91成人video| 不卡专区在线| 亚洲**2019国产| www成人免费观看| 久久久噜噜噜久久中文字免| 欧美24videosex性欧美| 欧美日韩成人在线观看| 丝袜美女在线观看| 欧美理论片在线观看| 亚洲男同gay网站| 欧美日韩国产成人在线观看| 主播国产精品| 欧美黄色免费网站| 77thz桃花论族在线观看| 欧美激情精品在线| 超碰97免费在线| 久久久久久久久久亚洲| 欧美videosex性极品hd| 91黑丝高跟在线| 欧美最新精品| 国产欧美精品xxxx另类| 婷婷久久免费视频| 91热精品视频| 999国产精品一区| 国内一区在线| 国产欧美日韩| 香蕉精品视频在线| 欧美影院一区| 亚洲不卡中文字幕无码| 亚洲在线观看| av网站在线不卡| 国产在线精品一区二区夜色| 日本成人在线免费| www成人在线观看| 国产又粗又猛又爽又黄av| 国产精品福利一区二区三区| 免费在线观看a级片| 亚洲一区二区三区中文字幕在线| 欧美福利视频一区二区| 欧美伊人精品成人久久综合97| 99草在线视频| 亚洲精品美女网站| aaa在线观看| 欧美激情xxxxx| 欧美大片高清| 91在线免费看网站| 欧美挤奶吃奶水xxxxx| 久久99精品久久久久子伦| 欧美亚洲在线日韩| av在线免费观看国产| 乱码第一页成人| 日本黄色一级网站| 久久婷婷综合激情| 五月天婷婷色综合| 丰满岳妇乱一区二区三区| 在线观看中文字幕2021| 亚洲第五色综合网| 一级毛片视频在线| 91极品视频在线| 久久久久久久性潮| 精品国产乱码久久久久软件| 精品久久影院| 蜜桃视频成人在线观看| 久久伊人亚洲| 欧美成人精品一区二区综合免费| 国产欧美精品一区二区三区四区| 国产在线观看成人| 欧美日韩精品一区二区三区| 神马午夜一区二区| 久热精品视频在线免费观看| 蜜桃视频m3u8在线观看| aaa级精品久久久国产片| 久久国产成人精品| 欧美日韩在线中文| 粉嫩aⅴ一区二区三区四区五区| 人妻熟人中文字幕一区二区| 天天综合色天天综合| 99在线观看精品视频| 色香蕉久久蜜桃| 国产精品一区二区三区在线播放| 国产又大又黄又猛| 性中国古装videossex| 一区二区三区欧洲区| 国产欧美在线看| 日韩深夜影院| 韩日视频在线观看| 国产一本一道久久香蕉| 五月天精品视频| 午夜精品福利一区二区三区av| 在线观看免费高清视频| 一本色道久久88综合亚洲精品ⅰ| 亚洲女同志freevdieo| 精品国产乱码久久久久久88av| 亚洲福利精品| 国产精品无码一区二区三| 亚洲福利一二三区| 色窝窝无码一区二区三区| 国内自拍欧美激情| 美女视频亚洲色图| 国产成人a亚洲精v品无码| www日韩大片| 中文字幕第2页| 日韩一级裸体免费视频| 国产视频网站一区二区三区| 青青视频免费在线| 高清在线观看日韩| 国产91精品一区| 中文字幕精品久久久久| 中文成人激情娱乐网| 久久www视频| www.欧美色图| 99re这里只有精品在线| 中文字幕欧美在线| 国产乱码精品一区二区三区亚洲人| 欧美少妇一区二区三区| 国产成人午夜99999| 日韩美女一级片| 亚洲欧洲在线观看| 国产精品一区二区精品视频观看| 日韩中文字幕在线不卡| 97久久精品人人做人人爽50路| 国产嫩bbwbbw高潮| 久久精品国产综合| 精品国产一区二区三区成人影院| 男人亚洲天堂网| 日日骚欧美日韩| 26uuu另类亚洲欧美日本老年| 在线不卡av电影| 日韩1区2区| 一区二区中文字幕| chinese全程对白| 欧洲精品视频在线观看| 男人的天堂在线视频免费观看 | 亚洲欧洲日本国产| 国产.欧美.日韩| 波多野结衣视频免费观看| 久久亚洲精品成人| 在线日本制服中文欧美| 日本黄色www| 色老汉一区二区三区| 在线三级中文| 日本一区二区在线视频| 东方aⅴ免费观看久久av| 国产情侣免费视频| 国内精品久久久久伊人av | 佐佐木明希av|