[英]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.