如何在不知道其类型的情况下删除结构
How do I delete a stucture without knowing its type?
这是我的代码:
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()
或 LONG ptr = (LONG)new EditWndProcStatus()
创建的。
不,你不能那样做。它只有在使用继承并且为结构/类提供虚拟析构函数时才有效:
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
No.
删除表达式: ::选择删除转换表达式
在第一个备选方案(删除对象)中,如果静态类型 要删除的对象不同于其动态类型,即静态 类型应是要成为的对象的动态类型的基类 已删除,静态类型应具有虚拟析构函数或 行为未定义 [5.3.5/3]
delete
的操作数应与分配类型相同(除非基本/派生情况)
相关文章:
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 在不使用任何 STL 容器的情况下删除重复项
- 如何在不泄漏内存的情况下删除链接列表
- 使用QT,如何在不读取整个文件的情况下删除文本文件中的第一行
- C++ 如何在不丢失内存的情况下删除节点
- 如何在没有递归的情况下删除链接列表
- 在只给定单个链接列表中间的节点的情况下删除该节点.C++
- 在不使用虚拟析构函数的情况下删除继承的对象时中止
- 检查目录树是否可以在不实际开始删除的情况下删除
- 如何在不知道其类型的情况下删除结构
- C++ 在不知道位置的情况下删除矢量中的特定值
- 如何在不导入任何库的情况下删除矢量
- 重写类运算符new并在不更改类的情况下删除
- 如何在无权访问的情况下删除对象
- 我将如何在不损坏列表的情况下删除链表中的节点
- Qmake:如何在不更改Qmake .conf的情况下删除某个项目的编译器标志
- 我可以在不检查是否存储该对象的情况下删除联合组件吗?
- 内存管理 - 是否可以在不调用析构函数的情况下删除 c++ 中的对象
- 我可以在不中断代码的情况下删除此警告吗?