簡體   English   中英

在對象初始化之前訪問 C++ std::vector 對象成員

[英]Accessing C++ std::vector object members before object initialization

我剛剛意識到我可以訪問我的空對象向量列表的對象成員。 我認為 vector.reserve(nmb) 只是保留所需的內存(一種 nmb*sizeof(object))。

#include <iostream>
#include <vector>



class Car {

    public: int tires = 4;

    Car(void) {
        std::cout << "Constructor of Car" << std::endl;
    }
};

int main()
{
    std::vector<Car> carList;
    carList.reserve(20);
    std::cout << "Car tires: " << carList[0].tires << std::endl;
    std::cout << "Now comes the emplace_back:" << std::endl;
    carList.emplace_back();
    std::cout << "Car tires: " << carList[0].tires << std::endl;

    //Car carArray[20];
    //std::cout << "Car tires: " << carArray[0].tires << std::endl;

    return 0;
}

給我:

Car tires: 0                                                                                                                                        
Now comes the emplace_back:                                                                                                                         
Constructor of Car                                                                                                                                  
Car tires: 4                                                                                                                                        

...Program finished with exit code 0 

為什么我可以訪問尚未初始化的對象的成員? 謝謝你。

因為operator[]不進行任何邊界檢查(並且在編譯優化的二進制文件時僅轉換為一些指針算術)。 這樣std::vector可以像普通的 C 數組一樣有效地使用。

您讀取的0恰好在內存中,向量在堆上保留了空間。 請注意,操作系統將程序的內存初始化為0作為安全措施(因此您無法查看舊數據)。 如果您的應用程序運行時間更長並且頁面被回收,您還可以觀察其他垃圾值。

您可以嘗試at()來檢查邊界。

訪問std::vector超出其大小(不是其容量)的元素具有未定義的行為

未定義的行為意味着不能保證任何特定的事情都會發生。 究竟發生了什么取決於編譯器和標准庫的特定實現。

@ypnos 提到了一種可能的行為,但是 C++ 標准也允許(任何)其他行為,並且可能取決於標准庫實現std::vector准確程度以及編譯器優化的准確程度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM