C++ 标准是否保证 std::vector 的底层指针初始化为 nullptr

Does C++ standard guarantee that std::vector's underlying pointer initialized as nullptr

根据https://en.cppreference.com/w/cpp/container/vector/data,如果大小为0

,底层指针不保证为nullptr

If size() is 0, data() may or may not return a null pointer.

但这是否适用于没有元素的默认初始化 std::vector?还是只是简单地说明如果向量的所有元素都被擦除,底层指针可能不会变为 nullptr?

考虑以下行:

std::vector<int> fooArr;
int* fooArrPtr = fooArr.data();

是否保证fooArrPtr等于nullptr?

没有

标准保证 default-initialised std::vectorsize() 等于零,但这并不要求 data() 将 return nullptr.

标准中没有任何内容可以阻止(并且“不阻止”不等同于“要求”)具有零 .size() 和 non-zero [=15] 的 default-constructed 向量=].在这种情况下,.data() 到 return 指向已分配内存的指针(这将是 non-null 是可行的,但取消引用它仍然会有未定义的行为,因为 .size() 为零 [并且不需要初始化分配的容量])。

如果要测试向量大小是否为零,请使用 .size().empty()。不要调用 .data() 并将结果与​​ nullptr.

进行比较

实例化空向量时,不会分配内存。 然后清除所有元素并不意味着 vector 释放其内部内存(当插入新元素时这仍然可用)。只有在调用析构函数时才会释放内存。

长话短说,您不能使用 data() 检查向量是否为空。

此外,根据 data() returns 您是否 nullptr 或更少,甚至不建议检查向量是否存在某些成员。您不能确定内部模板实现总是授予您这个 属性.