做程序開發一定會和編譯器打交道,編譯器優化可以給我們代碼運行帶來一定的提升,但也可能存在一些意想不到的問題。下面就是我在開發時候遇到的一個坑,希望可以給大家一些借鑒
直接上代碼說話吧
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編譯器中就不會。
所以,如果遇到以上情況,換個編譯器試試!