最近使用两个线程同时进行图像采集,每次采集都要在两个子线程中分别new出一块内存,用完后分别delete。可是程序运行几次就出现指令引用的内存不能written。忘各位高手指导!

解决方案 »

  1.   

    new/delete/操作内存线程间要做互斥。
      

  2.   

    new和delete要操作同样的内存指针等,注意对应关系
      

  3.   

     而且在delete前应判断它是否为NULL.
      

  4.   

    那就在线程外申请内存,当作线程的参数传进去嘛:)然后线程结束之后再delete。这样就不会频繁咯
      

  5.   

    new 和delete要是在一个线程中完成的话,属于比较简单的那种,只要是在delete的时候,首先判定下是否是为空,然后delete掉,然后再将指针置空就好了。
    如果是两个操作分别位于不同的线程中的话,就稍微麻烦下,你可以讲内存空间声明在主线程,然后在启动线程的时候传入,这样省事一些。也可以通过事件排斥来记录是否删除过了,免得进行了重复的删除。估计你的错误,就是进行了重复的删除,没有在删除前进行判定是否为空,而进行了删除后,也要将指针置空
      

  6.   

    在delete的时候,自己要确定该指针是用new分配且没有被delete过的指针,并且不会再被任何线程使用了。
    另外还要尽量避免多个线程使用同一个指针变量,可以通过线程通讯等方式传递指针,但最好不要共用变量,如果不能避免,则需要加锁同步。
      

  7.   

    注意互斥的问题,new一个没有delete的不行,delete一个还没有new完的也不行。搞个成员变量做标志来判断后再进行响应的操作
      

  8.   

    new的时候,在内部调用malloc,此时系统会锁定堆.若是这时候你的这个线程被切换,调度了另一个线程,在new的话,就回出问题了
    所以 new/delete/操作内存线程间要做互斥。
      

  9.   

    crt堆的知识:
    每个加载的crt库都带有一个crt堆。一个进程可能加载多个crt库,因此可能由多个crt堆。
    某个crt堆分配的内存只能由该堆释放。
    msvcrt或者msvcrxx是基于Windows堆实现的。
    对Windows堆的访问要串行化,这是缺省设置。你可以参考MSDN,在索引中输入HeapCreate,观看该主题。你所描述的问题应该不是堆的问题,而是线程同步问题,可能是在一个线程分配内存,在另一个访问该内存,由于缺乏正确同步,导致内存访问违例。
      

  10.   

    纠正:msvcrt或者msvcrxx的堆是基于Windows堆实现的。