首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否允许显式调用析构函数,然后在具有固定生存期的变量上放置new?

是否允许显式调用析构函数,然后在具有固定生存期的变量上放置new?
EN

Stack Overflow用户
提问于 2017-03-05 01:19:34
回答 2查看 1.1K关注 0票数 21

我知道显式调用析构函数会导致未定义的行为,因为双重析构函数调用,就像下面这样:

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  return 0;  // Oops, destructor will be called again on return, double-free.
}

但是,如果我们调用placement new来“复活”对象呢?

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  new (&foo) std::vector<int>(5);
  return 0;
}

更正式地说:

  1. 在C++中会发生什么(我对C++03和C++11都感兴趣,如果有区别的话),如果我显式地调用某个对象的析构函数,而这个对象最初不是用placement new构造的(例如,它要么是局部/全局变量,要么是用new分配的),然后,在这个对象被析构之前,对它调用placement new来“恢复”它?
  2. 如果它是ok的,那么是否保证对该对象的所有非常数引用也都是ok的?只要我在对象“死”的时候不使用它们?
  3. 如果是这样,是否可以使用一个非常数引用来放置新对象以复活对象?
  4. 常量引用怎么办?

示例用例(尽管这个问题更多的是关于好奇心):我想“重新分配”一个没有operator=的对象。

我见过this members,它说“覆盖”具有非静态const成员的对象是非法的。因此,让我们将这个问题的范围限制在没有任何const成员的对象上。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42598915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档