即使超出范围,我也可以保留矢量数据吗

Sha*_*der 3 c++ allocation vector

我来自 C 背景。例如,我曾经分配内存/数组,将其发送到其他地方,并且指针保留在那里,即使在分配它的范围被破坏之后也是如此。

现在,如果我对向量执行相同的操作:初始化,通过引用传递它,然后将该引用保存在某处。在实际创建向量的初始方法超出范围之后,它会被销毁吗?或者由于指向它的指针仍然被保存,它将被保留。

Max*_*mer 7

std::vector当它被销毁时释放它所持有的内存。持有对被破坏的对象的引用是非常糟糕的。访问它的是UB。一般规则:不要存储引用,仅在可以确定对象存在于整个范围内的情况下使用它们,例如作为函数的参数。

如果您想保留数据的副本,只需复制std::vector. 无需参考。

如果您希望能够从不同位置访问数据,并且只要至少一个位置仍然有指向它的引用/指针就使其保持活动状态,请不要使用 ,而应std::vector使用std::shared_ptr

如果您想将 的优点std::vector与共享内存的优点结合起来,直到最后一个位置释放它为止,请将它们结合起来:std::shared_ptr<std::vector<...>>

如果您想std::vector在一个地方生活一段时间,然后在另一个地方生活但不再在第一个地方,请使用移动语义

std::vector<int> foo = {1, 2, 3};
std::vector<int> bar = std::move(foo); // bar now holds the data that foo held, foo is empty, no copy was performed
Run Code Online (Sandbox Code Playgroud)