大家讨论一下内存分配、释放的问题 不应该混用吧,new和delete都是操作符啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 malloc, free对对象的构造、析构过程一无所知。malloc<-->freenew<-->delete 虽然我的回答有点武断,但我还是坚持自己的观点:你在C语言时代,申请和释放内存用的不是malloc+delete吧,malloc和delete是两个时代的不同的概念;在C++里面才涉及到new和delete这两个关键字,我个人以为这不是一个值得讨论的问题,是个人对程序的理解和编写程序的习惯而以。如果你的同事这样写代码,我怀疑那个人对C和C++的理解有问题,而你居然抓住这个问题在这里与大家探讨,只能说明1.你的好奇心大,2.你们公司真空闲。自己去体会,呵呵,帮不了你。 to yu_hl(卖柴火的小男孩) :说得详细一些我不要“应该”,我要“why”!给我机理上的解释! 我写了一个试了一下,VC编译没有问题;但是BoundsChecker会有警告,却不会有memory leak的警告。是编译器的纵容? malloc返回值是void,因此当把它的返回值赋给一个变量时需要把值进行类型转换;new直接返回申请的数据类型的指针;malloc属于函数,new属于运算符;malloc和new都是从内存堆中申请空间,从这一点上看是相同的。 malloc--分配原始内存(raw memory)new--先分配原始内存,然后调用该类型的构造函数.free--释放malloc分配的原始内存delete--先调用该类型的析构函数,然后释放原始内存.MFC的缺省内存分配器是malloc,也就是说,在MFC程序中调用new,最终将会调用malloc.但是由于为一个堆对象分配内存需要消耗额外的字节以记录和内存相关的信息,而这些又是实现细节, new和malloc最终分配的原始内存的大小和布局是否相同不得而知,所以将它们混用也许不会出问题,但是存在极大的隐患.我想没有哪个公司希望看到这样的代码. 如何知道自己的内存有泄露?也就是 gofire(床前太阳光,疑是鸡蛋汤;) 说的 BoundsChecker在哪里?? coppermine(coppermine) 说的不错 多谢coppermineto storein:BoundsChecker is a sophisticated error-detection tool that detects over 5000 API, OLE, memory, pointer, and leak errors. ftp://202.120.1.132/soft/NuMega.BoundsChecker.VisualC++6.5/ coppermine的解释不错,但是:MFC的缺省内存分配器是malloc,也就是说,在MFC程序中调用new,最终将会调用malloc.但是由于为一个堆对象分配内存需要消耗额外的字节以记录和内存相关的信息,而这些又是实现细节, new和malloc最终分配的原始内存的大小和布局是否相同不得而知,所以将它们混用也许不会出问题,malloc关MFC什么事?new和MFC也无关的。 我想应该可以的吧?!不过,既使可以,也会有隐患。但反过来好像就不行了。应该去看看cc的实现和cppc的实现,不同的compiler可能会有不同 如果不牵扯到Class的构造及解构,只是内存分配不会有问题.但要是牵扯到Class的构造及解构将有大问题. malloc出来的对象是不会调用构造函数的. 关于tooltip气泡提示类的问题 急!请教MSChart散点图的画法? 如何实现多实例快捷键?? 【请教】在切分的窗体上如何添加系统菜单?? ADO访问oracle的问题!? 大家以来来骂微软!!!有120分可以拿!!!都以前没结的帖子!!! 在VC中如何做报表啊? 不要分了!!! 为什么不能对资源进行编辑了? 在vc中写个win32程序怎么做? 急急急!UDP的问题 高手、、、、为什么我用mysql和MFC。。。。。。。
malloc<-->free
new<-->delete
你在C语言时代,申请和释放内存用的不是malloc+delete吧,malloc和delete是两个时代的不同的概念;在C++里面才涉及到new和delete这两个关键字,我个人以为这不是一个值得讨论的问题,是个人对程序的理解和编写程序的习惯而以。如果你的同事这样写代码,我怀疑那个人对C和C++的理解有问题,而你居然抓住这个问题在这里与大家探讨,只能说明1.你的好奇心大,2.你们公司真空闲。
自己去体会,呵呵,帮不了你。
malloc属于函数,new属于运算符;
malloc和new都是从内存堆中申请空间,从这一点上看是相同的。
new--先分配原始内存,然后调用该类型的构造函数.free--释放malloc分配的原始内存
delete--先调用该类型的析构函数,然后释放原始内存.MFC的缺省内存分配器是malloc,也就是说,在MFC程序中调用new,最终将会调用
malloc.但是由于为一个堆对象分配内存需要消耗额外的字节以记录和内存相关的信息,而这些又是实现细节, new和malloc最终分配的原始内存的大小和布局是否相同不得而知,所以将它们混用也许不会出问题,但是存在极大的隐患.我想没有哪个公司希望看到这样的代码.
也就是 gofire(床前太阳光,疑是鸡蛋汤;)
说的
BoundsChecker在哪里??
malloc.但是由于为一个堆对象分配内存需要消耗额外的字节以记录和内存相关的信息,而这些又是实现细节, new和malloc最终分配的原始内存的大小和布局是否相同不得而知,所以将它们混用也许不会出问题,malloc关MFC什么事?new和MFC也无关的。
但反过来好像就不行了。
应该去看看cc的实现和cppc的实现,不同的compiler可能会有不同
但要是牵扯到Class的构造及解构将有大问题. malloc出来的对象是不会调用构造函数的.