none
vs2012 c++ console debug运行正常,release运行出现内存错误,release模式把编译配置md改成mdd正常,求解。 RRS feed

  • 问题

  • 环境是win7+vs2012,

    代码地址:http://pan.baidu.com/s/1hq3OCGs,,这个是百度网盘。

    ----------

    下面上4张图。一张张说明问题:图片中的代码只是一部分。

    以上代码是在创建一个类时执行,这是该类的构造函数。执行环境release模型。

    在我调试的时候,调试的箭头的顺序依次为:59,60,67,61,64,65,...

    我想问这是为什么,为什么会跳来跳去...

    --------

    y以上第二张图,疑问是,没有执行int ServerConfig::Initialize( const wchar_t* script_file_name )函数,直接就跳到了ReadConfigScript函数,why?

    ---------

    因为这里只能上传2张图,所以,在百度网盘里的有一个word文件有对后续2张图的描述。

    ---

    当在release下,我把md改成mdd就没有问题,可是这样一来,是不是对于代码的执行性能有影响,实在是不理解这是为什么。

    求大神指点一二,感激不尽啊...


    • 已编辑 oiooooio 2014年6月30日 0:59
    2014年6月27日 2:19

答案

  • #if defined(_DEBUG)
    #define CONFIGFILEPATH  L"../Debug/login-server.txt"
    #elif defined(NDEBUG)
    #define CONFIGFILEPATH  L"../Release/login-server.txt"
    //#define CONFIGFILEPATH  L"login-server.txt"
    #endif
    

    就如上面代码,我在release模式下用了

    #define CONFIGFILEPATH  L"login-server.txt"

    这样的代码,release调试的时候,可能没有注意到:

    	if(!tmpFile.is_open()){
    		assert(false);
    		return mc_system::FAILED;
    	}
    
    从这里直接跳到了函数末尾,导致我一直以为L"login-server.txt"不带路径是可以的。幸好有朋友提醒,我试了一下,竟然真的是这种问题,必须这样写才行:
    #define CONFIGFILEPATH  L"../Release/login-server.txt"

    谢谢帮忙!

    感谢!

    ---

    • 已标记为答案 oiooooio 2014年7月3日 8:24
    2014年7月3日 8:20

全部回复

  • 你好,

    请问你在release 模式下具体的错误是什么?

    MD和MDD的区别主要是:/MDd 链接C++标准库中用于debug build所必需的部分,  /MD 大体上相似,但是它使用的是 NDEBUG 版本的标准库。详细的解释你可以参考MSDN文档。 其部分内容如下:

    /MD                    

    Causes your application to use the multithread- and DLL-specific version of the run-time library. Defines _MT and _DLL and causes the compiler to place the library name MSVCRT.lib into the .obj file.

    Applications compiled with this option are statically linked to MSVCRT.lib. This library provides a layer of code that allows the linker to resolve external references. The actual working code is contained in MSVCR100.DLL, which must be available at run time to applications linked with MSVCRT.lib.

    /MDd                    

    Defines _DEBUG, _MT, and _DLL and causes your application to use the debug multithread- and DLL-specific version of the run-time library. It also causes the compiler to place the library name MSVCRTD.lib into the .obj file.

    所以我觉得你需要解决的还是release 模式下的具体问题。

    另外,如果你想在release下debug, 可以参考如下步骤进行。

    How to: Debug a Release Build

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2014年7月1日 6:36
  • 你好,

    谢谢你的回复。

    因为msdn发帖只让我发2张图片,所以我把相关的问题以及代码都放在了百度网盘:

    代码地址:http://pan.baidu.com/s/1hq3OCGs

    主要是在 release模式下,调试时,出现内存错误,烦请大神帮忙看看,代码里没有主动引用外部库,只是一个读取文件,实在不知道为什么会这样...

    2014年7月2日 2:23
  • #if defined(_DEBUG)
    #define CONFIGFILEPATH  L"../Debug/login-server.txt"
    #elif defined(NDEBUG)
    #define CONFIGFILEPATH  L"../Release/login-server.txt"
    //#define CONFIGFILEPATH  L"login-server.txt"
    #endif
    

    就如上面代码,我在release模式下用了

    #define CONFIGFILEPATH  L"login-server.txt"

    这样的代码,release调试的时候,可能没有注意到:

    	if(!tmpFile.is_open()){
    		assert(false);
    		return mc_system::FAILED;
    	}
    
    从这里直接跳到了函数末尾,导致我一直以为L"login-server.txt"不带路径是可以的。幸好有朋友提醒,我试了一下,竟然真的是这种问题,必须这样写才行:
    #define CONFIGFILEPATH  L"../Release/login-server.txt"

    谢谢帮忙!

    感谢!

    ---

    • 已标记为答案 oiooooio 2014年7月3日 8:24
    2014年7月3日 8:20