相关疑难解决方法(0)

何时使用虚拟析构函数?

我对大多数OO理论有了深刻的理解,但让我困惑的一件事是虚拟析构函数.

我认为无论什么以及链中的每个对象,析构函数总是会被调用.

你什么时候打算让它们成为虚拟的?为什么?

c++ polymorphism shared-ptr virtual-destructor

1420
推荐指数
13
解决办法
66万
查看次数

什么是这个额外的参数传递到虚拟析构函数?

我有这个代码:

class Class {
public:
    virtual ~Class() {}
};

int main()
{
    Class* object = new Class();
    delete object;
}
Run Code Online (Sandbox Code Playgroud)

我使用Visual C++ 10编译并获取delete object语句的反汇编:

delete object;
test        eax,eax  
je          wmain+23h (401041h)  
mov         edx,dword ptr [eax]  
push        1  
mov         ecx,eax  
call        dword ptr [edx]
Run Code Online (Sandbox Code Playgroud)

这对于实际的析构函数:

Class::`scalar deleting destructor':
test        byte ptr [esp+4],1  
push        esi  
mov         esi,ecx  
mov         dword ptr [esi],offset Class::`vftable' (402100h)  
je          Class::`scalar deleting destructor'+18h (401018h)  
push        esi  
call        dword ptr [__imp_operator delete (4020A8h)]  
pop         ecx  
mov         eax,esi …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ virtual-destructor

14
推荐指数
3
解决办法
826
查看次数

这是否存在此代码的已定义行为,该行为通过基类指针删除派生类?

此代码是否导致定义的行为?

class A {
    int x;
};
class B {
    short y;
};
class C {
    double z;
};

class D : public A, public B, public C {
    float bouncy;
};

void deleteB(B *b) {
    delete b;
}

void is_it_defined() {
    D *d = new D;
    deleteB(d);

    B *b = new D;  // Is this any different?
    delete b;
}
Run Code Online (Sandbox Code Playgroud)

如果没有定义,为什么不呢?如果是,它定义的是什么以及为什么?最后,如果定义了实现,您能举例说明一个常见的实现可能会定义行为吗?

c++

2
推荐指数
1
解决办法
200
查看次数