做程序开发一定会和编译器打交道,编译器优化可以给我们代码运行带来一定的提升,但也可能存在一些意想不到的问题。下面就是我在开发时候遇到的一个坑,希望可以给大家一些借鉴
直接上代码说话吧
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编译器中就不会。
所以,如果遇到以上情况,换个编译器试试!