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::vector
的 size()
等于零,但这并不要求 data()
将 return nullptr
.
标准中没有任何内容可以阻止(并且“不阻止”不等同于“要求”)具有零 .size()
和 non-zero [=15] 的 default-constructed 向量=].在这种情况下,.data()
到 return 指向已分配内存的指针(这将是 non-null 是可行的,但取消引用它仍然会有未定义的行为,因为 .size()
为零 [并且不需要初始化分配的容量])。
如果要测试向量大小是否为零,请使用 .size()
或 .empty()
。不要调用 .data()
并将结果与 nullptr
.
进行比较
实例化空向量时,不会分配内存。
然后清除所有元素并不意味着 vector 释放其内部内存(当插入新元素时这仍然可用)。只有在调用析构函数时才会释放内存。
长话短说,您不能使用 data()
检查向量是否为空。
此外,根据 data()
returns 您是否 nullptr
或更少,甚至不建议检查向量是否存在某些成员。您不能确定内部模板实现总是授予您这个 属性.
根据https://en.cppreference.com/w/cpp/container/vector/data,如果大小为0
,底层指针不保证为nullptrIf 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::vector
的 size()
等于零,但这并不要求 data()
将 return nullptr
.
标准中没有任何内容可以阻止(并且“不阻止”不等同于“要求”)具有零 .size()
和 non-zero [=15] 的 default-constructed 向量=].在这种情况下,.data()
到 return 指向已分配内存的指针(这将是 non-null 是可行的,但取消引用它仍然会有未定义的行为,因为 .size()
为零 [并且不需要初始化分配的容量])。
如果要测试向量大小是否为零,请使用 .size()
或 .empty()
。不要调用 .data()
并将结果与 nullptr
.
实例化空向量时,不会分配内存。 然后清除所有元素并不意味着 vector 释放其内部内存(当插入新元素时这仍然可用)。只有在调用析构函数时才会释放内存。
长话短说,您不能使用 data()
检查向量是否为空。
此外,根据 data()
returns 您是否 nullptr
或更少,甚至不建议检查向量是否存在某些成员。您不能确定内部模板实现总是授予您这个 属性.