如果调用析构函数并将分配的内存再次用于其他对象,会发生什么情况?

芒果
class base
{
    virtual ~base();
};

class der1 :public base
{
    int i;
}

class der2 :public base //I used double that der2 is bigger than der1
{
    double d;
}

int main()
{
   base* ptr = new der2;
   ptr->~base(); //Destructor call just for the
                 //case that the der2 had a pointer member

   der1* ptr2 = static_cast<der1*>(ptr);
   *ptr2 = der1();

   delete ptr;

   return 0;
}

如果您执行上面显示的代码,将会发生什么?这会导致内存泄漏吗?如果是,为什么呢?是否可以在不先释放已占用内存的情况下将其用于其他类型?(请没有答案,例如为什么您需要这个,这只是兴趣)

编辑:〜base()不执行任何操作,因为这是一个示例。

迈克·西摩

这是未定义的行为,因为您分配给对象并在对象的生存期结束后将其删除,这是C ++ 11 [basic.life] / 5所禁止的:

在对象的生存期结束之后以及在重新使用或释放​​该对象所占用的存储之前,可以使用任何指向该对象将要或将要位于的存储位置的指针,但只能以有限的方式使用。该程序在以下情况下具有未定义的行为:

  • 该对象将是或曾经是具有非平凡析构函数的类类型,并且该指针用作delete-expression的操作数
  • 指针用于调用对象的非静态成员函数

(加上一些其他限制。)您尝试同时做这两个事情。

如果要解决此问题,请在旧内存中创建一个新对象,而不是像在内存中已经存在对象那样分配给它:

der1* ptr2 = new (ptr) der1;

那么它仍然是不确定的行为,如C ++ 11,[basic.life] / 7中所述

如果在对象的生存期结束之后并且在重新使用或释放​​该对象所占用的存储之前,在原始对象所占用的存储位置上创建了一个新对象,则指向原始对象的指针[...]如果新对象与原始对象具有相同的类型,则可以使用]来操纵新对象

(加上其他一些条件)。您可以使用指向旧对象的指针来操作(特别是删除)其他类型的新对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

虚拟析构函数,如果在派生类中没有析构函数,会发生什么情况?

如果您在接收块的末尾不再次调用该函数,会发生什么情况?-Erlang

析构函数调用抽象函数时会发生什么

当析构函数调用构造函数时会发生什么?

如果我使用JNI从C的多个线程中调用Java函数,会发生什么情况?

如果从类文件中删除超级构造函数调用,会发生什么情况?

如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

如果我在不将其返回值分配给变量的情况下调用函数,会发生什么情况?

如果 std::vector 使用移动构造函数将对象重新分配到新内存,那么为什么必须在原始对象上调用析构函数?

如果在其他线程仍在运行时调用exit(0),会发生什么情况?

如果我不在扩展类中调用可选的超级方法或构造函数,会发生什么情况?

重新分配向量后,向量中的内存会发生什么情况

如果RISCV LOAD的宽度大于剩余的内存,会发生什么情况?

如果未将new Class()的结果分配给变量,会发生什么情况

vector :: clear如何在不丢失分配的内存的情况下调用析构函数

在不调用析构函数、复制或移动的情况下初始化(分配)内存

如果不引用对象,Java中的对象会发生什么情况,例如:myString.concat(“ that”)

如果PHP总是按引用复制对象,如果将在方法中创建的对象分配给成员变量,会发生什么情况?

如果规则多次应用于表单,会发生什么情况

如果 Spot 实例不可用于 AWS 自动扩展组,会发生什么情况?

如果在取消点上调用信号处理程序,会发生什么情况?

如果在ajax调用期间显示警报窗口,会发生什么情况?

如果我不为JobService调用jobFinished,会发生什么情况?

如果在匿名子程序中调用shift,会发生什么情况?

在Java函数中创建并存储在对象中的对象会发生什么情况?

如果子类未在Java中定义构造函数,会发生什么情况?

如果未在lambda函数中取消超时处理程序,会发生什么情况?

如果我在PHP函数的末尾不包含“ return”,会发生什么情况?

如果将很少的参数传递给Shell函数,会发生什么情况?