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

芒果
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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

是Java中的垃圾回收专用于JVM吗,如果一个JVM中的应用程序正在泄漏内存,其他JVM会发生什么情况?

来自分类Dev

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

来自分类Dev

iOS:当我从其他类调用重写的方法时,会发生什么情况

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如果析构函数用于向量中的对象,是否将调用该析构函数?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如果我在已删除的实体上调用EF Reload,会发生什么情况?

来自分类Dev

如果方法A调用方法B并且都具有[Transaction]属性,会发生什么情况?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

当我将unpack()作为lua的函数参数调用时,会发生什么情况?

来自分类Dev

Matlab OOP:当在数组属性上调用get函数时,会发生什么情况?

来自分类Dev

如果不将字体嵌入Flash,会发生什么情况?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

    是Java中的垃圾回收专用于JVM吗,如果一个JVM中的应用程序正在泄漏内存,其他JVM会发生什么情况?

  4. 4

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

  5. 5

    iOS:当我从其他类调用重写的方法时,会发生什么情况

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

    如果析构函数用于向量中的对象,是否将调用该析构函数?

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

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

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

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

  19. 19

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

  20. 20

    如果我在已删除的实体上调用EF Reload,会发生什么情况?

  21. 21

    如果方法A调用方法B并且都具有[Transaction]属性,会发生什么情况?

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

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

  26. 26

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

  27. 27

    当我将unpack()作为lua的函数参数调用时,会发生什么情况?

  28. 28

    Matlab OOP:当在数组属性上调用get函数时,会发生什么情况?

  29. 29

    如果不将字体嵌入Flash,会发生什么情况?

热门标签

归档