求助大家一个小问题

u010258183 2013-08-08 08:42:03
用malloc函数创建的指针,释放指针所指对象的时候,控制台为什么会卡住不动,
而new建立的内存,释放内存不会卡住呢。用delete或者free函数释放的内存。还有他们有什么区别吗?
...全文
203 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
fldmxp 2013-08-09
  • 打赏
  • 举报
回复
你这个问题我听说过,你是多线程么?当你正在分配时在api深层将会进入互斥量,在调用HeapAlloc的里面时,然后此线程突然被杀了,此线程还在有信号状态时,另外的线程再也进不来了
Mikey_O 2013-08-08
  • 打赏
  • 举报
回复
什么叫卡住不动哦??? 没有出现的情况哦。
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
卡住是因为你 盘子=malloc(...); ... free(碗);
楼上代码你看看
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 8 楼 ananluowei 的回复:
[quote=引用 5 楼 u010258183 的回复:] [quote=引用 4 楼 ananluowei 的回复:] c的动态内存申请方式: malloc 申请内存 ,free 释放内存 c++动态内存申请: new= malloc+调用对象构造函数 , delete 调用对象析构函数 + free
请问这个析构不就是释放内存吗,那free释放内存不调用析构函数怎么释放内存啊[/quote] 析构不是释放内存,析构是销毁对象。析构的对象不能用,占据的内存还在。所以还需要释放内存。 delete p 会把析构和释放2部分的工作都做了。 所以c++中应该用 delete 来释放 new 申请的内存。[/quote] #include <iostream> using namespace std; int main() { void *p=malloc(4); int a=5; p=&a; cout<<*reinterpret_cast<int*>(p)<<endl; free(p); return 0; } 代码贴上一运行,为什么会卡住不动
mujiok2003 2013-08-08
  • 打赏
  • 举报
回复
贴完整代码。 分配和释放要配对
赵4老师 2013-08-08
  • 打赏
  • 举报
回复
卡住是因为你 盘子=malloc(...); ... free(碗);
lijunbiao2080 2013-08-08
  • 打赏
  • 举报
回复
引用 2 楼 u010258183 的回复:
[quote=引用 1 楼 max_min_ 的回复:]

 malloc 只会分配内存的 不会调用构造函数 帮你构造对象的
 new 会调用构造函数构造对象的


 free  只是释放内存空间, 不会调用析构函数的!
 delete 会调用析构函数析构对象的!

 malloc 和 free成对出现
 new 和delete 成对出现
释放内存不就是调用析构函数才可以吗?不调用析构函数怎么释放内存呢[/quote] 谁说释放内存就是调用析构函数,调用析构函数的目的是为了在释放内存前做些处理,比如 class A { int a; int c; }; class B { int b; A *pA; B() { pA = new A; } ~B() { delete pA; } } 如果你new B;申请一块内存,然后你delete后,如果你不在析构函数中delete pA的话,只是释放了B中的int b;A *pA;你申请的pA指向的内存并不会被释放
大尾巴猫 2013-08-08
  • 打赏
  • 举报
回复
引用 5 楼 u010258183 的回复:
[quote=引用 4 楼 ananluowei 的回复:] c的动态内存申请方式: malloc 申请内存 ,free 释放内存 c++动态内存申请: new= malloc+调用对象构造函数 , delete 调用对象析构函数 + free
请问这个析构不就是释放内存吗,那free释放内存不调用析构函数怎么释放内存啊[/quote] 析构不是释放内存,析构是销毁对象。析构的对象不能用,占据的内存还在。所以还需要释放内存。 delete p 会把析构和释放2部分的工作都做了。 所以c++中应该用 delete 来释放 new 申请的内存。
max_min_ 2013-08-08
  • 打赏
  • 举报
回复
引用 5 楼 u010258183 的回复:
[quote=引用 4 楼 ananluowei 的回复:] c的动态内存申请方式: malloc 申请内存 ,free 释放内存 c++动态内存申请: new= malloc+调用对象构造函数 , delete 调用对象析构函数 + free
请问这个析构不就是释放内存吗,那free释放内存不调用析构函数怎么释放内存啊[/quote] 析构函数只是释放对象而已,如果new出内存空间的话, 还是需要手动delete掉的!
hordemark 2013-08-08
  • 打赏
  • 举报
回复
obj->~destructor()
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 4 楼 ananluowei 的回复:
c的动态内存申请方式: malloc 申请内存 ,free 释放内存 c++动态内存申请: new= malloc+调用对象构造函数 , delete 调用对象析构函数 + free
请问这个析构不就是释放内存吗,那free释放内存不调用析构函数怎么释放内存啊
大尾巴猫 2013-08-08
  • 打赏
  • 举报
回复
c的动态内存申请方式: malloc 申请内存 ,free 释放内存 c++动态内存申请: new= malloc+调用对象构造函数 , delete 调用对象析构函数 + free
u010258183 2013-08-08
  • 打赏
  • 举报
回复
还有为什么用malloc,再用free运行程序控制台会卡住
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 1 楼 max_min_ 的回复:

 malloc 只会分配内存的 不会调用构造函数 帮你构造对象的
 new 会调用构造函数构造对象的


 free  只是释放内存空间, 不会调用析构函数的!
 delete 会调用析构函数析构对象的!

 malloc 和 free成对出现
 new 和delete 成对出现
释放内存不就是调用析构函数才可以吗?不调用析构函数怎么释放内存呢
max_min_ 2013-08-08
  • 打赏
  • 举报
回复

 malloc 只会分配内存的 不会调用构造函数 帮你构造对象的
 new 会调用构造函数构造对象的


 free  只是释放内存空间, 不会调用析构函数的!
 delete 会调用析构函数析构对象的!

 malloc 和 free成对出现
 new 和delete 成对出现
lijunbiao2080 2013-08-08
  • 打赏
  • 举报
回复
引用 16 楼 u010258183 的回复:
[quote=引用 9 楼 lijunbiao2080 的回复:] [quote=引用 2 楼 u010258183 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

 malloc 只会分配内存的 不会调用构造函数 帮你构造对象的
 new 会调用构造函数构造对象的


 free  只是释放内存空间, 不会调用析构函数的!
 delete 会调用析构函数析构对象的!

 malloc 和 free成对出现
 new 和delete 成对出现
释放内存不就是调用析构函数才可以吗?不调用析构函数怎么释放内存呢[/quote] 谁说释放内存就是调用析构函数,调用析构函数的目的是为了在释放内存前做些处理,比如 class A { int a; int c; }; class B { int b; A *pA; B() { pA = new A; } ~B() { delete pA; } } 如果你new B;申请一块内存,然后你delete后,如果你不在析构函数中delete pA的话,只是释放了B中的int b;A *pA;你申请的pA指向的内存并不会被释放[/quote] 请问这样理解对吗,析构一个对象,该对象所占内存被释放,只是如果不在析构里面处理,该对象里指针所指对象占的内存还在。我感觉上面的2个朋友说,析构一个对象是销毁对象和释放内存是一个意思吧?你说呢?[/quote] delete 一个指针,只是释放了本指针指向的堆,并不会释放你的堆中所包含的指针指向的堆,所以需要调用你的析构函数自己去释放,析构函数的作用就是在这里,如果你没有pA = new A这一段的话,有没有析构函数都无所谓。你要好好看一看堆栈方面的只是了。
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 15 楼 ananluowei 的回复:
[quote=引用 12 楼 u010258183 的回复:] #include <iostream> using namespace std; int main() { void *p=malloc(4); int a=5; p=&a; cout<<*reinterpret_cast<int*>(p)<<endl; free(p); return 0; } 代码贴上一运行,为什么会卡住不动
p = &a的时候把a的地址给了p,p原先的地址丢了,free(p)的时候是free a的地址,当然出错。 我认为 p= &a 应该改成 *p = a才合理,把a的值赋给p指向的内存地址中[/quote] 我明白了,现在&a是栈里面的地址,不需要自己去释放它的内存,因为内部会自动释放该内存。
u010258183 2013-08-08
  • 打赏
  • 举报
回复
引用 9 楼 lijunbiao2080 的回复:
[quote=引用 2 楼 u010258183 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

 malloc 只会分配内存的 不会调用构造函数 帮你构造对象的
 new 会调用构造函数构造对象的


 free  只是释放内存空间, 不会调用析构函数的!
 delete 会调用析构函数析构对象的!

 malloc 和 free成对出现
 new 和delete 成对出现
释放内存不就是调用析构函数才可以吗?不调用析构函数怎么释放内存呢[/quote] 谁说释放内存就是调用析构函数,调用析构函数的目的是为了在释放内存前做些处理,比如 class A { int a; int c; }; class B { int b; A *pA; B() { pA = new A; } ~B() { delete pA; } } 如果你new B;申请一块内存,然后你delete后,如果你不在析构函数中delete pA的话,只是释放了B中的int b;A *pA;你申请的pA指向的内存并不会被释放[/quote] 请问这样理解对吗,析构一个对象,该对象所占内存被释放,只是如果不在析构里面处理,该对象里指针所指对象占的内存还在。我感觉上面的2个朋友说,析构一个对象是销毁对象和释放内存是一个意思吧?你说呢?
大尾巴猫 2013-08-08
  • 打赏
  • 举报
回复
引用 12 楼 u010258183 的回复:
#include <iostream> using namespace std; int main() { void *p=malloc(4); int a=5; p=&a; cout<<*reinterpret_cast<int*>(p)<<endl; free(p); return 0; } 代码贴上一运行,为什么会卡住不动
p = &a的时候把a的地址给了p,p原先的地址丢了,free(p)的时候是free a的地址,当然出错。 我认为 p= &a 应该改成 *p = a才合理,把a的值赋给p指向的内存地址中

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧