当前位置: 技术问答>linux和unix
如果释放动态内存多于当初分配的数目,积少成多会造成程序崩溃吗?
来源: 互联网 发布时间:2016-05-28
本文导语: 各位高人,我在linux环境下用c++开发,碰到了一个奇怪的现象:我本意是让某个子进程在无限循环作某项功能,但我发现在此子进程在循环了两万次左右就莫名其妙的不再循环下去,试了好多次都是到20000次左右就出...
各位高人,我在linux环境下用c++开发,碰到了一个奇怪的现象:我本意是让某个子进程在无限循环作某项功能,但我发现在此子进程在循环了两万次左右就莫名其妙的不再循环下去,试了好多次都是到20000次左右就出现这种情况,后来我发现这个子进程中的某个函数之内用new给指针p分配了动态内存: p = new char[1],注意只分配一个字节的内存!!!但是却在函数之外释放:delete[]p,(我确定在delete之后加了[]!), 但我发现在eclipse环境下debug查看,本应该只释放当初非配的一个字节内容, 但我发现在eclipse环境下debug查看,却发现和这1个字节相邻的后三个字节内容全部被修改为0x00,既多删除了动态内存!!我想请问:这种情况累计几万次,会不会就是造成调用此函数的子进程莫名其妙的不再无限循环的原因?(当然这个函数在内部new,却外部delete,不好,这个就不讨论了,只想问累计多删除动态内存就有可能会造成崩溃吗? 注意是有可能!)
|
我的意思是:藐视你的消息队列处理有问题?
|
你这个程序应该是new申请的空间把内存占用完了
new函数抛出异常。
new函数抛出异常。
|
弱弱的提一个小问题
char *p = NULL;
funct(p);
delete [] p;
你只用指针形参。。。 p不还是NULL?
char *p = NULL;
funct(p);
delete [] p;
你只用指针形参。。。 p不还是NULL?
|
你的程序是錯的,有隱含的BUG!
char *p =0; /* 這裡定義一個char類型的指針,沒錯吧?並且指針初始化為空 */
/*
* 這個函數是出錯的地方。函數的參數傳遞只有兩種形式:傳值和傳引用。傳指針實際上也是一種傳值調用。
* 實際的調用過程是這樣的,先傳個p給funct(),然後會產生一個p的副本,假如是pp,然後分配的那一個char
* 空間實際是那個pp指向的,而不是p指向的。這樣當funct()返回了以後,p裏面依然是NULL,所以相當於你
* delete了一個空指針,並且你在funct()裏面分配的內存也洩露了...
*/
funct(p);
。。。//使用完后delete[]
delete[] p;//我发现和p相邻的后三个字节内容全部被修改为0x00!!!
你看下麵這個測試代碼:
char *p =0; /* 這裡定義一個char類型的指針,沒錯吧?並且指針初始化為空 */
/*
* 這個函數是出錯的地方。函數的參數傳遞只有兩種形式:傳值和傳引用。傳指針實際上也是一種傳值調用。
* 實際的調用過程是這樣的,先傳個p給funct(),然後會產生一個p的副本,假如是pp,然後分配的那一個char
* 空間實際是那個pp指向的,而不是p指向的。這樣當funct()返回了以後,p裏面依然是NULL,所以相當於你
* delete了一個空指針,並且你在funct()裏面分配的內存也洩露了...
*/
funct(p);
。。。//使用完后delete[]
delete[] p;//我发现和p相邻的后三个字节内容全部被修改为0x00!!!
你看下麵這個測試代碼:
#include
void func(char* p)
{
p = new char[1];
}
int main()
{
char* ptr = NULL;
std::cout
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
站内导航:
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!