将矢量作为数组传递是否安全?

uj2*_*uj2 17 c++ arrays stl vector

说我有一个功能:

void someFunc(int *x,int count);
Run Code Online (Sandbox Code Playgroud)

这是我无法控制的,所以我不能写它来接受迭代器.

这样调用它是否安全(无论具体的STL实现如何):

vector<int> v;
/* ... */
someFunc(&v[0],v.size());
Run Code Online (Sandbox Code Playgroud)

显然,一个反例就是vector<bool>.其他类型怎么样?(假设我没有vector以任何方式专门化).

Job*_*Job 31

从第23.2.4节,标准的第1点:

[...]向量的元素是连续存储的,这意味着如果v是一个向量,其中T是除bool之外的某种类型,那么它遵循所有0的标识&v [n] ==&v [0] + n <= n <v.size().

所以是的,它是安全的.

注意:如果v是空的v[0]是未定义的行为,所以你只能这样做,如果v没有空.

  • 是的,@ Jon,它仍未定义.你在没有元素的向量上调用`vector :: operator []`函数.*本身*本身*未定义.在您获取结果的地址并决定是否取消引用该指针时,您已经*处于未定义行为区域.你之后做什么或不做什么都可以带回来. (4认同)
  • 如果向量为空则不安全,因为`v [0]`或`v.front()`是那种未定义的行为.由于这是最高投票和选择的答案,因此将其包括在内是件好事.此外,如果函数长期存储指针并且向量被释放或重新分配,则指针变为无效. (3认同)
  • 虽然这是事实,但cplusplus.com并不是一个明确的参考. (2认同)

Jam*_*lis 9

是.假设v.size() > 0这是安全的(如果向量为空,则v[0]导致未定义的行为).

std::vector容器的元素是连续存储的,就像在普通数组中一样.


dar*_*rak 9

正如其他人所说,它是安全的.

但我想要一个小预订.如果此函数接受数组并将其存储以供以后使用,则可能存在问题.这是因为如果需要它来改变大小,std :: vector可以自由地释放它的内存.因此,如果此函数只使用数组(复制或其他)或您永远不会改变它,那么它是安全的.

我只想指出这一点,仅仅因为矢量元素是连续存储的,所以传递它并不是自动安全的.所有权仍然是一个问题.