0

这是我拥有的代码:

struct WndProcStatus {
    WNDPROC OrgWndProc;
};

struct ButtonWndProcStatus {
    WNDPROC OrgWndProc;
    bool bIsPressed;
    bool bIsFocused;
    bool bIsDefault;
    bool bIsDisabled;
    bool bDrawFocusRect;
    bool bMouseOver;
    bool bShowAccel;
};

struct EditBoxWndProcStatus {
    WNDPROC OrgWndProc;
    bool bIsFocused;
    bool bIsDisabled;
    bool bMouseOver;
    bool bTextSelected;
};

在我的程序中,我将有一个指向 ButtonWndProcStatus 结构或 EditBoxWndProcStatus 结构的指针,但我不知道它是哪一个。

我可以将指针转换为 WndProcStatus,然后使用 delete 命令从内存中删除结构吗?

指针是使用LONG ptr = (LONG)new ButtonWndProcStatus()or创建的LONG ptr = (LONG)new EditWndProcStatus()

4

3 回答 3

1

不。

删除表达式:::选择删除 强制转换表达式

在第一种选择(删除对象)中,如果待删除对象的静态类型与其动态类型不同,则静态类型应为待删除对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义 [5.3.5 / 3]

的操作数delete应与分配的类型相同(除非基/派生情况)

于 2013-10-20T20:31:03.270 回答
1

不,你不能那样做。只有使用继承并且为结构/类提供虚拟析构函数时,它才能工作:

struct WndProcStatus
{
    virtual ~WndProcStatus() = default;

    WNDPROC OrgWndProc;
};

struct ButtonWndProcStatus
    : public WndProcStatus // derive, this also inherits OrgWndProc
{
    bool bIsPressed;
    bool bIsFocused;
    bool bIsDefault;
    bool bIsDisabled;
    bool bDrawFocusRect;
    bool bMouseOver;
    bool bShowAccel;
};

现在通过指针删除应该是安全的。此外,您可以轻松编写

WndProcStatus* p = new ButtonWndProcStatus; // look ma, no cast!
delete p; // this is now safe
于 2013-10-20T20:31:17.087 回答
-1

当使用运算符 delete 时,未指定删除对象的类型。所以我没有看到问题,因为据我了解,您没有任何结构继承。

于 2013-10-20T20:31:49.663 回答