当向量中没有元素时,返回指向向量的底层缓冲区的正确方法是什么(size() == 0)
。我先调用vector.reserve()
,因此分配了内存。
我已尝试过以下操作,但它为我预期的相同值提供了不同的指针值。从我用Google搜索的内容来看,当.front()
为零时,似乎未定义调用.data()
和size()
。我需要获得一个指向矢量的指针,以便我可以将它传递给C函数。
int main() {
std::unique_ptr<std::vector<int>> vec(new std::vector<int>(10));
std::cout << std::hex
<< (uint64_t)&vec.get()[0] << " "
<< (uint64_t)&vec->front() << " "
<< (uint64_t)vec->data() << std::endl;
return 0;
}
输出:
2b324a4cec20 2b324a4cec40 2b324a4cec40
如果您在GCC上运行此代码,.data()
将返回0.标准然后表示front()
未定义,因为size()
为0.您可以看到指针值不同。发生了什么事?
答案 0 :(得分:0)
在阅读这些注释和更多googling之后,如果size()== 0
,似乎无法在不调用未定义行为的情况下检索向量的底层缓冲区(即使保留)&安培;无法调用operator [0],因为它是空矢量的UB
&安培;无法调用at(0),因为它与operator []相同(并进行范围检查)
.data()无法调用,因为它只保证 [data(),data()+ size)是有效范围,而不是范围 从0开始。
无法调用&amp; front(),因为它是空矢量的UB
我个人认为这是语言中的错误。如果已调用reserve,Data()应返回指向vector的指针