【发布时间】:2018-08-12 21:57:02
【问题描述】:
当我执行以下语句时:
vector <int> v;
v 的值究竟是多少?
它只是一个指向内存块开头的指针吗?它的值会是NULL吗?
一些点可能重复到另一个比这个更复杂的问题,并且较少关注1)调用vector类的默认构造函数和2)我认为是指针的数组的初始化到int。
【问题讨论】:
当我执行以下语句时:
vector <int> v;
v 的值究竟是多少?
它只是一个指向内存块开头的指针吗?它的值会是NULL吗?
一些点可能重复到另一个比这个更复杂的问题,并且较少关注1)调用vector类的默认构造函数和2)我认为是指针的数组的初始化到int。
【问题讨论】:
您的语法将调用不带参数的构造函数,也称为默认构造函数。根据std::vector constructor documentation,可以看到会创建一个空向量。
它指向的指针无关紧要,因为当容器为空时,您不应该取消引用它的值。请注意,如果您想存储内部指针的值,例如std::vector::data(),它可能会在您向向量中添加元素时随时更改(嗯,从技术上讲,您可以预测指针何时会更改,但这是一个很好的练习就像指针总是在变化一样)。
【讨论】:
v 的值究竟是多少?
指针? - 不。
NULL - 没有。
nullptr - 没有。
v 是类 std::vector<T> 的一个实例(其中 T 是 int)。
在 Ubuntu Linux 64 位上,“std::vector<T> tVec;”不管怎样都占用 24 个字节
或
对象的内脏不类似于int数组,但实现确实维护了一个T数组,可能在动态内存中。
对于每个编译器,实现可能会有所不同。
【讨论】:
vector <int> v;v 的值究竟是多少?
这是默认初始化的语法。因此,对象将处于默认的初始化状态。对于std::vector 等类类型,默认初始化调用默认构造函数。 An online reference 这样描述了vector的默认构造函数:
1) 默认构造函数。构造一个空容器。如果没有提供分配器,则分配器是从默认构造的实例中获取的。
它只是一个指向内存块开头的指针吗?它的值会是NULL吗?
向量不是指针。
在其他成员中,向量实现确实包含一个指针,该指针可能指向向量管理的缓冲区 - 您可以使用 std::vector::data 成员函数获取该指针的副本。默认初始化向量的内部指针的状态是未指定。由于空向量不需要缓冲区,因此该指针可能为空 - 但不是必需的。
【讨论】: