【发布时间】:2018-02-11 13:29:33
【问题描述】:
作为“消息”类的一部分,我尝试通过将不同类型的指针转换为 void* 指针并将它们保存在记住指针原始类型的包装类(“MsgData”)中来传输不同类型的指针。
例如一个布尔指针:
bool* data = new bool;
event.wheel.y < 0 ? *data = false : *data = true;
send("all", this, MSG_MOUSE_SCROLL, MsgData(data));
MsgData 的兼容构造函数被调用,变量被保存为我的消息类的成员:
MsgData(): type_(NULLPTR), data_(nullptr) {} // Null
MsgData(const bool* data): type_(BOOL), data_((void*)data) {} // Bool
MsgData(const std::string* data): type_(STRING_STD), data_((void*)data) {} // std::string
// ... etc.
我可以将指针转回并使用它们而不会出现任何错误,但是当我尝试删除它们时程序崩溃:
~MsgData() {
switch (type_) {
case (BOOL):
if ((bool*)data_)
delete (bool*)data_;
break;
// ... etc.
}
}
bool 指针只是一个示例,所有其他类型和类也一样。 仅当我尝试删除指针时程序才会崩溃。将它们转换回原来的类型并使用它们不是问题。
我研究了这个问题,并在 StackOverflow 上发现了类似 this one 的问题,但是虽然将指针转换为 void* 并返回似乎被认为是不好的风格,但我找不到程序崩溃的原因。
【问题讨论】:
-
或
std::variant。 -
你的方法应该有效。如果没有minimal reproducible example,我们将无能为力。
-
为了调试您的代码,我们需要查看它。
-
如果你真的想调试它(这是不必要的,因为你应该用理智的东西代替它)打印出你
new和delete的所有东西的类型和地址,然后检查记录不匹配的地方。或者,如果您使用的是 linux,请通过-fsanitize=undefined,address在运行时分析此类错误。 -
您的代码可能会由于许多与您得出的问题完全无关的原因而崩溃。程序在
delete中可靠崩溃的事实可以用其他原因来解释,例如内存损坏。
标签: c++ pointers casting delete-operator void-pointers