gpt4 book ai didi

c++ - 在对象初始化之前访问C++ std::vector对象成员

转载 作者:行者123 更新时间:2023-12-01 15:13:29 25 4
gpt4 key购买 nike

我只是意识到我可以访问空对象 vector 列表中的对象成员。
我认为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恰好是 vector 在堆上保留了空间的内存中。请注意,操作系统使用0初始化程序的内存是一种安全措施(因此您无法窥视旧数据)。如果您的应用程序运行时间更长并且页面被回收,您还可以观察到其他垃圾值。

您可以尝试使用at()来检查边界。

关于c++ - 在对象初始化之前访问C++ std::vector对象成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com