当前位置: 技术问答>linux和unix
为什么多线程编程中new的内存在delete时出现非法操作?
来源: 互联网 发布时间:2015-06-23
本文导语: 有个项目使用pthread进行多线程编程,一个线程A,一个线程B,第一个线程new了一片内存,另一个线程B使用该内存,当整个进程退出时,线程Adelete该内存,此时报告段错误,然后整个程序非法退出,我试过在delete该片内存时,该片内...
有个项目使用pthread进行多线程编程,一个线程A,一个线程B,第一个线程new了一片内存,另一个线程B使用该内存,当整个进程退出时,线程Adelete该内存,此时报告段错误,然后整个程序非法退出,我试过在delete该片内存时,该片内存可以被正常的访问,但是一delete马上报错,而我写的其他很多测试程序,情况相同却从未错过,真是搞不懂到底在那一种特殊情况下会有delete错误,请有过类似经验的高手指点,谢谢!
注:该项目是使用c++builderx1.0编译的debug版
注:该项目是使用c++builderx1.0编译的debug版
|
>>另一个线程B使用该内存,当整个进程退出时,线程Adelete该内存
确认B线程不会读写对已经被A释放的内存
>>3.主线程在用户接入后会利用Node对象的成员来new一片内存,然后线程B和线程C会使用该内存
B和C同时使用该内存吗
这些地方有没有互斥?
确认B线程不会读写对已经被A释放的内存
>>3.主线程在用户接入后会利用Node对象的成员来new一片内存,然后线程B和线程C会使用该内存
B和C同时使用该内存吗
这些地方有没有互斥?
|
关于指针的非法操作,
可能的情况就是那几种:
delete的指针不是new返回的
重复delete,
溢出
可能的情况就是那几种:
delete的指针不是new返回的
重复delete,
溢出
|
还有一种情况是由于使用了不同的c/c++ 运行库造成的
一个运行库new出来的只可以由自己delete
要是有动态联结库的使用就会有多于一个c/c++ 运行库的情况产生
一个运行库new出来的只可以由自己delete
要是有动态联结库的使用就会有多于一个c/c++ 运行库的情况产生
|
请检查在线程B中有没有修改该内存的头指针?
|
pthread不是真正的线程,这与Windows中不同。线程A申请的内存,当A正常退出时会被系统自动释放。而你的程序在delete时,线程A可能已经退出了。
|
提一个笨方法,
在A、B、C中分别对该内存写入不同的内容,然后读出,看看值是否正确。
在A、B、C中分别对该内存写入不同的内容,然后读出,看看值是否正确。