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] 删除。
我来说两句