博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译器优化陷阱——全局指针多次使用异常
阅读量:4344 次
发布时间:2019-06-07

本文共 2029 字,大约阅读时间需要 6 分钟。

做程序开发一定会和编译器打交道,编译器优化可以给我们代码运行带来一定的提升,但也可能存在一些意想不到的问题。下面就是我在开发时候遇到的一个坑,希望可以给大家一些借鉴

直接上代码说话吧

1 static unsigned char* s_data = NULL;                    //存储一帧视频数据 2 void DoRendering () 3 { 4     // D3D11 case 5     if (s_DeviceType == kUnityGfxRendererD3D11 && EnsureD3D11ResourcesAreCreated()) 6     { 7         ID3D11DeviceContext* ctx = NULL; 8         g_D3D11Device->GetImmediateContext (&ctx); 9 10         // update native texture from code11         if (g_TexturePointer)12         {13             ID3D11Texture2D* d3dtex = (ID3D11Texture2D*)g_TexturePointer;14             D3D11_TEXTURE2D_DESC desc;    //保存纹理信息15             d3dtex->GetDesc (&desc);    //获取纹理信息16 17             //unsigned char* s_data = new unsigned char[desc.Width*desc.Height*4];18             //char* errorMessage = new char[80];19             char errorMessage[80];20 21             if (!s_isInitRender)22             {23                 s_data = (unsigned char*)malloc(desc.Width*desc.Height*4);24                 InitRender(desc.Width, desc.Height, 2, errorMessage);    //初始化渲染参数25                 if (NULL == s_hThread)26                 {27                     unsigned threadID;    //线程ID28                     s_hThread = (HANDLE)_beginthreadex( NULL, 0, SfpRefreshThread, NULL, 0, &threadID );     //新线程控制渲染频率29                 }30             }31             //控制刷新频率32             if ( s_refreshFlag && s_isInitRender )33             {34                 if ( !RenderTextureWithVideo(desc.Width*4,s_data))35                 {36                     ReleaseRender(2);           //释放渲染内存37                     free(s_data);38                     s_data = NULL;39                 }40                 ctx->UpdateSubresource (d3dtex, 0, NULL, s_data, desc.Width*4, 0);41                 s_refreshFlag = false;42             }43         }44         ctx->Release();45     }

在第1行定义了一个全局指针变量,在函数DoRendering中分配和释放内存,多次调用这个函数,就会多次分配和释放该指针的内存。

但是在VC编译器中,第二次调用该函数后,程序会崩溃,但在GCC编译器中就不会。

所以,如果遇到以上情况,换个编译器试试!

转载于:https://www.cnblogs.com/HuangWj/p/5473465.html

你可能感兴趣的文章
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>
原生和jQuery的ajax用法
查看>>
iOS开发播放文本
查看>>
20145202马超《java》实验5
查看>>
JQuery 事件
查看>>
main(argc,argv[])
查看>>
第四阶段 15_Linux tomcat安装与配置
查看>>
NAS 创建大文件
查看>>
学习笔记-模块之xml文件处理
查看>>
接口测试用例
查看>>