[英]Dereferencing a pointer to size_t, but cast from void pointer
基本上,我将用户生成的事件推送到SDL事件队列中。 为此,我将整数的地址压入void指针,该指针是SDL_PushEvent()的data1参数。
稍后,我尝试取消引用从队列中获取的事件中的void指针。 但是,当我这样做时,我应该获得的值(1002)与我实际获得的值相去甚远:140733847900856。
我最初是从void指针转换为整数指针的。 las,我使用的是64位体系结构,因此必须使用size_t。 但是我对size_t的用法并不完全熟悉,所以我可能做错了什么。
以下是来自两个不同源文件的代码段:
来自“ splash.cpp”:
if(elapsed >= 13000 && !(flag)){
std::cerr << "13 seconds elapsed.\n";
// Create and push a CHANGE_GAME_MODE event to the queue.
SDL_Event tmp;
size_t data1 = MAIN_MENU_MODE;
tmp.type=SDL_USEREVENT;
tmp.user.code= CHANGE_GAME_MODE;
tmp.user.data1 = &data1;
tmp.user.data2 = NULL; // Not used.
std::cerr << "Value of data1 before SDL_PushEvent():"
<< *((size_t*)(tmp.user.data1)) << "\n";
SDL_PushEvent(&tmp);
flag = true;
}
来自events.cpp:
case SDL_USEREVENT:
std::cerr << "\nUser event detected: " << *((size_t*)(event->user.data1)) << "\n";
user_event(event->user.type, event->user.code, event->user.data1, event->user.data2);
break;
这是我实际运行程序时cerr的结果:
sysadm@druid: ./kolodruidtale
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
13 seconds elapsed.
Value of data1 before SDL_PushEvent():1002
User event detected: 140688563309902
ALSA lib pcm.c:7843:(snd_pcm_recover) underrun occurred
(注意:我知道是什么原因导致缓冲区不足,以及如何解决它。不过,我想首先解决此解除引用问题,所以不用担心。:D)
感谢您的时间。
在splash.cpp
,定义一个新变量size_t data1 = MAIN_MENU_MODE;
在堆栈上分配的。 然后,将其地址存储到tmp.user.data1
。 当size_t data1
在splash.cpp
超出范围时,它将被自动删除。
当在events.cpp
取消引用events.cpp
event->user.data1
,您会得到此时该堆栈上该地址中的任何内容。 该指针称为悬挂指针 ,解引用会导致未定义的行为。 在您的情况下,您将得到一个“随机”数字。 通常,您会遇到细分错误。
您可能想在堆上分配此变量以进行尝试,例如
size_t *data1 = new size_t(MAIN_MENU_MODE);
并记得在不再需要它时将其删除!
您的data1
是对象,其地址存储在tmp.user.data1 中,位于if的本地 。
因此,它在退出该块时将被销毁,并且您将留下一个悬空的指针。
您可能想使用new
在堆上分配data1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.