最近开发一个小型的服务器系统(使用多线程),有时会在动态内存分配new发生访问异常。
后来看了一个文章 http://davidyu720.itpub.net/post/31716/462851,文章提示到多线程的工程需要修改编译选项为多线程库(我的系统以前是单线程库)。现请问大家:1.是不是只要改为多线程库就不会出现 分配new发生访问异常的错误?
            2.哪位朋友能帮我讲下为什么单线程库偶尔会发生分配new发生访问异常?
          3.单线程库跟多线程库的本质区别是什么?

解决方案 »

  1.   

    你怎么创建线程?
    CreateThread?要使这样的话 有问题正常应该使用_beginthread, _beginthreadex
      

  2.   

    编译选项选择为多线程库, 只是告诉链接器, 链接多线程库(静态或动态).另外, 设置为多线程库和单线程库的一个显著区别就是:
    单线程库为标准的C运行时库(LIBC.lib, LIBC.dll), 其中的很多函数像printf, malloc(包括new)等等, 在多线程程序运行中会发生不可知异常, 而多线程库是标准C运行时库的改进(MSVCRT.lib, MSVCRT.dll), 使这些函数在多线程程序中运行不会出现问题.
    最后,你应该知道的是:工作线程异常退出或强行终止(用TerminateThread)都会使工作线程中分配的内存发生泄漏(Leaking), 而与本身代码正确无关.
      

  3.   

    非常感谢LS 2位的回复。
    akirya :由于我的工程是SDK的,不是MFC,所以只能用CreateThread;yjgx007:还想请教一个问题:按这样说,不管以后什么样的工程都应该使用多线程库??  反正多线程库也支持单线程工程!(VS2005编译环境就只有多线程库)
      

  4.   


    一样可以使用_beginthreadex
    最好使用多线程库
      

  5.   

    凡是与GUI界面有关的, 建议用多线程库.
    本身GUI界面也是作为一个独立线程在运行的.
      

  6.   

    OK!基本上了解!散分。Thanks!
      

  7.   


    _beginthread _beginthreadex是C库的。
    在C程序中使用CreateThread绝对的有问题。