将动态分配的变量移动到向量中

use*_*903 5 c++ heap move vector

给出以下C++代码:

std::vector<int> myVec;
int* num = new int(1);
myVec.emplace_back(std::move(*num));
Run Code Online (Sandbox Code Playgroud)

如果将具有动态存储持续时间的变量移动到容器(例如向量)中,num如果myVec被销毁(超出范围),仍然需要手动删除吗?如果我用push_back而不是,有什么区别emplace_back吗?

sky*_*ack 3

*num您正在复制存储在向量中的值。
这与这样做没有太大区别:

int* num = new int(1);
int cpy = *num;
Run Code Online (Sandbox Code Playgroud)

因此,是的,您必须删除它。
在代码中以某种方式处理指针时,向量不会神奇地处理对象的生命周期。


unique_ptr如果你想控制对象的生命周期,你可以使用s :

myVec.emplace_back(std::make_unique<int>(1));
Run Code Online (Sandbox Code Playgroud)

无论如何,这需要您将向量的类型从 更改std::vector<int>std::vector<std::unique_ptr<int>>

否则,您可以这样做:

std::vector<int> myVec;
auto num = std::make_unique<int>(1);
myVec.emplace_back(*num);
Run Code Online (Sandbox Code Playgroud)

一旦num超出其范围,分配的内存将被释放。

  • “向量不会神奇地处理所包含对象的生命周期。” – 但他们确实如此。只是不是元素所复制的对象的生命周期。 (2认同)