zoukankan      html  css  js  c++  java
  • 编译器优化陷阱——全局指针多次使用异常

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

    直接上代码说话吧

     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编译器中就不会。

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

  • 相关阅读:
    JavaWeb核心之Servlet
    Http&Tomcat
    XML&反射
    JDBC连接池和DBUtils
    JDBC
    testng依赖
    java mysql
    eclipse自动补全的设置
    java Logger 的使用与配置
    python数据持久存储:pickle模块的基本使用
  • 原文地址:https://www.cnblogs.com/HuangWj/p/5473465.html
Copyright © 2011-2022 走看看