1. 程式人生 > >標準庫容器裡存的是引用還是實體物件?

標準庫容器裡存的是引用還是實體物件?

以前沒有認真思考過容器裡存的到底是引用還是物件。因為存引用的話會減少呼叫拷貝構造帶來的開銷,但是那樣的話就不能儲存local object(區域性物件)的引用,那樣會給容器的使用範圍帶來很大的侷限性。所以,容器裡存的是實體物件。這是今天在寫程式碼查一個bug的時候發現的。場景是程式碼從檔案中讀取資料,存到一個list中。在呼叫append後,發現值就發生了變化,字串變成了空串,int變成了隨機值。(以下為Qt程式碼)
bool DataSource::setDataPath(QString path)
{
    bool ret = true;
    QFile file(path);
    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(&file);
        while(!in.atEnd())
        {
            ScoreInfo info;
            if(parse(in.readLine(), info))
            {
                m_data.append(info);//這一步執行後,m_data中的資料項是亂的
            }
        }
        file.close();
    }
    else
    {
        ret = false;
    }
    return ret;
}

後來才發現我在ScoreInfo類中為拷貝建構函式留了坑,卻沒有填上,導致容器中存入的是隨機值。append函式的介面是這樣的:
void append(const T &t);
這介面的樣子,讓我誤以為存的是引用,沒有認真去推敲這個問題。實際上,這裡引數為引用只是少了一次由實參到形參t的拷貝哦構造,由t到容器的物件這裡要呼叫一次拷貝建構函式。

相關推薦

標準容器的是引用還是實體物件?

以前沒有認真思考過容器裡存的到底是引用還是物件。因為存引用的話會減少呼叫拷貝構造帶來的開銷,但是那樣的話就不能儲存local object(區域性物件)的引用,那樣會給容器的使用範圍帶來很大的侷限性。所以,容器裡存的是實體物件。這是今天在寫程式碼查一個bug的時候發現的。場景

JDK1.8版本java字串常量池的是String物件還是引用

採用new關鍵字新建一個字串物件時,JVM首先在字串池中查詢有沒有"xyz"這個字串物件,如果有,則不在池中再去建立"xyz"這個物件了,直接在堆中建立一個"xyz"字串物件,然後將堆中的這個"xyz"物件的地址返回賦給引用s3,這樣,s3就指向了堆中建立的這個"xyz"字串物件;如果沒有,則首先在字串池中建

C++ STL常用標準容器

其中幾種種序列容器型別 C++ STL中最基本以及最常用的類或容器無非就是以下幾個: string vector deque list forward_list queue priority_queue stack string 對比在C語言中一般怎麼使用

作為區域性變數的std::string和標準容器一種記憶體優化方法

實際專案中,往往看到好多專案把std::string, std::vector作為區域性變數直接使用的情況。 類似下面std::string的用法: void SomeClass::Fun() { std::string str = "abcd";

C++標準提供的complex定義的複數物件學習筆記

complex類可以定義多種資料型別的複數,其實部和虛部的資料型別可以是整數也可以是實數,即complex類是一個模板類,定義複數物件時,才指明資料成員型別,格式為: complex<資料型別> 物件名稱(實部值,虛部值); #include <iostr

【C++標準】STL容器

class move () val 條件 code con spa 數組元素 STL容器的共通能力 所有容器提供的都是“value語義”而非"reference語義"。容器進行元素的安插動作時,內部進行copy或者move,而不是管理元素的reference。 元素在容器

用 #include “filename.h” 格式來引用標準的頭文件

std 函數 ons name return console program 默認值 nbsp 用 #include “filename.h” 格式來引用非標準庫的頭文件(編譯器將 從用戶的工作目錄開始搜索) 1 #include <iostream> 2

Android進階之AS如何處理不同引用(module)jar的重複引起問題

1.問題 Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'. 2.原因 根據stackoverflow上面的回答,這個錯誤原因是因為包引用重複

【C++ STL應用與實現】72: 標準的堆--如何使用標準的heap演算法

本系列文章的目錄在這裡:目錄. 通過目錄裡可以對STL總體有個大概瞭解 前言 本文介紹如何使用STL裡的heap(堆)演算法。第一次接觸heap這種資料結構是在大學的資料結構教材上,它是一棵完全二叉樹。在STL中,heap是演算法的形式提供給我們使用的。

C++:C++標準中的關聯式容器Map

Map每個元素都是 key/value pair ,其中key是排序準則的基準。每個key只能出現一次,不允許重複。Map 也可被視為一種關聯式陣列,也就是“索引可為任意型別”的陣列。 以具體的兩個例子解釋什麼是map 例項一 #include "pch.h" #include

通俗易懂解析stm32 (一) HAL 標準 直接配置暫器 三種開發方式的區別

    通常新手在入門STM32的時候,首先都要先選擇一種要用的開發方式,不同的開發方式會導致你程式設計的架構是完全不一樣的。一般大多數都會選用標準庫和HAL庫,而極少部分人會通過直接配置暫存器進行開發。網上關於標準庫、HAL庫的描述相信是數不勝數。可是一個對於很多剛入門的朋

.Net Framework項目引用.NetStandard標準出現版本沖突解決辦法

ets tro fig 它的 需要 http red run 文件 今天在工作中出現一個引用問題,害我找問題找了很久。起因是在一個Winform項目下需要引用一個.NetStandard標準庫,標準庫引用了System.ComponentModel.Annotations程

Docker最全教程——數據容器化之持久保數據(十一)

sql 增加 通過 cli sel inf 遠程 支持 aaa 原文:Docker最全教程——數據庫容器化之持久保存數據(十一)上一節我們講述了SQL Server容器化實踐(註意,SQL Server現在也支持跨平臺),本節將講述如何持久保存數據,並且接下來將逐步講解其他

SQLServer數據,表內,實例名分析SQL語句

right log space _id 數據庫 con sys case sharp --數據庫內存分析 USE master go DECLARE @insSize TABLE(dbName sysname,checkTime VARCHAR(19),dbSize VA

1Python標準系列之模塊介紹

requestPython標準庫系列之模塊介紹Python的模塊其實就是封裝了一個或者多個功能的代碼集合,以便於重用,模塊可以是一個文件也可以是一個目錄,目錄的形式稱作包。模塊分類內置模塊內置模塊可以理解成當你安裝好python環境之後,直接可以使用import導入的就是內置模塊,默認模塊路徑為:C:\Pyt

4Python標準系列之sys模塊

maintained provides always access 解釋器 Python標準庫系列之sys模塊This module provides access to some variables used or maintained by the interpreter and to

10Python全棧之路系列之深淺拷貝標準系列之datetime模塊

格式轉換 字符串 Python標準庫系列之datetime模塊Fast implementation of the datetime type.功能說明datetime.date.today()打印輸出當前的系統日期datetime.date.fromtimestamp(time.time())將時間

3Python標準系列之os模塊

system python command creating provides Python標準庫系列之os模塊This module provides a portable way of using operating system dependent functionality. If

12Python標準系列之subprocess模塊

return error false Python標準庫系列之subprocess模塊This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their ret

9Python標準系列之time模塊

time模塊Python標準庫系列之time模塊This module provides various functions to manipulate time values.方法名說明time.sleep(int)等待時間time.time()輸出時間戳,從1970年1月1號到現在用了多少秒time.ct