c++ - 你能在 C++ 中破坏和重建 vector 的元素吗?

标签 c++ constructor destructor stdvector

在外部破坏和构造 vector 的元素是否合法?当然,假设您将同一组元素保留在开始时的构造状态中?并假设不做任何明显愚蠢的事情,比如在同一个元素上调用析构函数两次,或类似的。

撇开异常(exception)不谈,我设想的情况如下:

int main ()
{
  std::vector<std::string> v (10, "Hello");

  v [2].std::string::~string ();

  new (&v [2]) std::string ("World");
}

或者像这样的东西会是 UB 吗?其他标准容器呢?

最佳答案

这是完全有效的,就像您始终可以显式调用任何对象的析构函数一样。然而,这可能是愚蠢的。在销毁和复活元素之间, vector 处于无法被销毁的状态。如果由于某种原因它的析构函数被调用,你会得到 UB。这尤其危险,因为您可能不会一个接一个地执行这两个步骤。

现在,您不只是为了好玩才这样做。如果你想要例如要删除一个元素,您可以创建一个临时文件,将其与该元素交换,然后销毁临时文件。这样,您就不会拥有无法破坏 vector 的窗口。此外,这种方法甚至适用于像 std::string 元素这样的复杂情况,但也适用于更复杂的 vector 元素。

关于c++ - 你能在 C++ 中破坏和重建 vector 的元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49100469/

相关文章:

c++ - Qt - 这些代码行是什么意思

c++ - 在构造函数初始值设定项中使用成员的成员函数

c++ - C++ 中的类析构函数内存处理

c++ - 在类中声明一个数组,并使用构造函数设置其大小

c++ - C++ 构造函数中的混淆

c++ - 在自定义堆栈分配器中释放内存

c++ - 我类的析构函数做错了吗? C++

c++ - 如何在编译时为DSL解析文本?

c++ - 为什么此代码会出现运行时段错误?

c++ - "two-graph"中更改次数有限的最短路径