关于频繁在VC多线程中new和delete内存的问题 最近使用两个线程同时进行图像采集,每次采集都要在两个子线程中分别new出一块内存,用完后分别delete。可是程序运行几次就出现指令引用的内存不能written。忘各位高手指导! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 new/delete/操作内存线程间要做互斥。 new和delete要操作同样的内存指针等,注意对应关系 而且在delete前应判断它是否为NULL. 那就在线程外申请内存,当作线程的参数传进去嘛:)然后线程结束之后再delete。这样就不会频繁咯 new 和delete要是在一个线程中完成的话,属于比较简单的那种,只要是在delete的时候,首先判定下是否是为空,然后delete掉,然后再将指针置空就好了。如果是两个操作分别位于不同的线程中的话,就稍微麻烦下,你可以讲内存空间声明在主线程,然后在启动线程的时候传入,这样省事一些。也可以通过事件排斥来记录是否删除过了,免得进行了重复的删除。估计你的错误,就是进行了重复的删除,没有在删除前进行判定是否为空,而进行了删除后,也要将指针置空 在delete的时候,自己要确定该指针是用new分配且没有被delete过的指针,并且不会再被任何线程使用了。另外还要尽量避免多个线程使用同一个指针变量,可以通过线程通讯等方式传递指针,但最好不要共用变量,如果不能避免,则需要加锁同步。 注意互斥的问题,new一个没有delete的不行,delete一个还没有new完的也不行。搞个成员变量做标志来判断后再进行响应的操作 new的时候,在内部调用malloc,此时系统会锁定堆.若是这时候你的这个线程被切换,调度了另一个线程,在new的话,就回出问题了所以 new/delete/操作内存线程间要做互斥。 crt堆的知识:每个加载的crt库都带有一个crt堆。一个进程可能加载多个crt库,因此可能由多个crt堆。某个crt堆分配的内存只能由该堆释放。msvcrt或者msvcrxx是基于Windows堆实现的。对Windows堆的访问要串行化,这是缺省设置。你可以参考MSDN,在索引中输入HeapCreate,观看该主题。你所描述的问题应该不是堆的问题,而是线程同步问题,可能是在一个线程分配内存,在另一个访问该内存,由于缺乏正确同步,导致内存访问违例。 纠正:msvcrt或者msvcrxx的堆是基于Windows堆实现的。 网络编程之无线以太网知道 还是关于在对话框中动态生成按钮的问题! 有没有办法把所有IE的插件都删除啊,谢谢。。 在VC6.0中只能使用16色的图标吗? 库函数里有没有检查IP地址正确性的函数? 各位来探讨一下哪个出版社的书好 在那有下载VC.NET2003英文版? 属性页设置??请教100分 如何从IShellFolder或IShellView等接口获得IShellPropSheetExt接口? 文本数据结构大讨论,txt技术,还是binary,还是结构化存储(如复合文档) 谁有现成的支持CHECKBOX的 CTreeListCtrl可用 关于坐标系的
如果是两个操作分别位于不同的线程中的话,就稍微麻烦下,你可以讲内存空间声明在主线程,然后在启动线程的时候传入,这样省事一些。也可以通过事件排斥来记录是否删除过了,免得进行了重复的删除。估计你的错误,就是进行了重复的删除,没有在删除前进行判定是否为空,而进行了删除后,也要将指针置空
另外还要尽量避免多个线程使用同一个指针变量,可以通过线程通讯等方式传递指针,但最好不要共用变量,如果不能避免,则需要加锁同步。
所以 new/delete/操作内存线程间要做互斥。
每个加载的crt库都带有一个crt堆。一个进程可能加载多个crt库,因此可能由多个crt堆。
某个crt堆分配的内存只能由该堆释放。
msvcrt或者msvcrxx是基于Windows堆实现的。
对Windows堆的访问要串行化,这是缺省设置。你可以参考MSDN,在索引中输入HeapCreate,观看该主题。你所描述的问题应该不是堆的问题,而是线程同步问题,可能是在一个线程分配内存,在另一个访问该内存,由于缺乏正确同步,导致内存访问违例。