程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 編譯器優化陷阱——全局指針多次使用異常,陷阱全局

編譯器優化陷阱——全局指針多次使用異常,陷阱全局

編輯:C++入門知識

編譯器優化陷阱——全局指針多次使用異常,陷阱全局


做程序開發一定會和編譯器打交道,編譯器優化可以給我們代碼運行帶來一定的提升,但也可能存在一些意想不到的問題。下面就是我在開發時候遇到的一個坑,希望可以給大家一些借鑒

直接上代碼說話吧

 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 code
11         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;    //線程ID
28                     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編譯器中就不會。

所以,如果遇到以上情況,換個編譯器試試!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved