C++;使用new创建的对象,使用free()销毁的对象;这有多糟? 我正在修改一个相对大的C++程序,但不幸的是,我之前的人是否使用C或C++语法并不清楚(这是在一所大学的电气工程系,我们EES总是想用C来做所有的事情,不幸的是,在这种情况下,人们可以真正地逃脱它)。
但是,如果有人创建对象:C++;使用new创建的对象,使用free()销毁的对象;这有多糟? 我正在修改一个相对大的C++程序,但不幸的是,我之前的人是否使用C或C++语法并不清楚(这是在一所大学的电气工程系,我们EES总是想用C来做所有的事情,不幸的是,在这种情况下,人们可以真正地逃脱它)。,c++,memory-management,C++,Memory Management,但是,如果有人创建对象: Packet* thePacket = new Packet(); Packet*thePacket=newpacket() 是否使用删除包来销毁它是否重要或免费(软件包) 我意识到delete调用析构函数,而free()不调用,但数据包没有析构函数。我在内存管理沼泽中度过了一段糟糕的时光,我想这可能是众多问题之一。是的,这确实很重要 对于使用new获得的内存,您必须使用delete 对于使用malloc获得的内存,您必须使用free new和malloc可能会在内部
Packet* thePacket = new Packet();
Packet*thePacket=newpacket()代码>
是否使用删除包来销毁它是否重要代码>或免费(软件包)代码>
我意识到delete调用析构函数,而free()不调用,但数据包没有析构函数。我在内存管理沼泽中度过了一段糟糕的时光,我想这可能是众多问题之一。是的,这确实很重要
对于使用new
获得的内存,您必须使用delete
对于使用malloc
获得的内存,您必须使用free
new
和malloc
可能会在内部使用不同的数据结构来跟踪分配内存的内容和位置。因此,为了释放内存,您必须调用相应的函数来了解这些数据结构。然而,在一段代码中混合这两种类型的内存分配通常是一个坏主意 如果调用free()
,则不会调用析构函数
此外,还有
您还可以重写new
和delete
以专门对特定类进行操作。如果这样做,但是调用free()
而不是自定义的delete
,那么您将错过写入delete
的任何特殊行为。(但是如果你那样做了,你可能不会问这个问题,因为你会知道你错过了什么行为。你是绝对正确的,它是不正确的。正如你自己所说,free不会调用析构函数。即使数据包没有显式析构函数,它也使用继承的析构函数
在用new
创建的对象上使用free
就像只销毁浅拷贝所能达到的效果。深度销毁需要析构函数
另外,我不确定使用new()创建的对象是否与malloc()d内存位于同一内存映射中。我想,它们并不能保证是这样的。数据包
有一个析构函数,即使您没有明确声明一个。它有一个默认的析构函数。默认的析构函数实际上可能做的不多,但你不能指望会是这样。它的功能取决于编译器
new
和malloc
也可能有完全不同的实现。例如,delete总是在一个上下文中调用,在这个上下文中,delete拥有关于它在编译时删除的数据结构大小的完美信息<代码>免费
没有这种奢侈。new
正在使用的分配器可能不会将字节存储在内存区域的开头,说明它占用了多少字节。这将导致free
在释放用new
分配的内容时,执行完全错误的操作,并使程序崩溃
就个人而言,如果让人们做正确的事情或者自己修复代码是完全不可能的,我会宣布我自己的名为malloc的全局操作符为new
,这样free
肯定不会崩溃,即使它仍然不会调用析构函数,而且通常非常难看。简而言之,这和未定义的行为一样糟糕
这是不言自明的
C标准($7.20.3.2/2)-“免费
函数导致指向的空间
通过ptr进行解除分配,即,
可供进一步分配。
如果ptr是空指针,则不执行任何操作
否则,如果
与之前的指针不匹配
由calloc、malloc或
realloc函数,或者如果空间
通过拨打免费电话或
realloc,行为未定义。“
如果有人创建了一个对象:
Packet* thePacket = new Packet();
是否用删除包的方式销毁有关系;还是免费的
是的,这很重要free(thePacket)
会调用未定义的行为,但delete thePacket
不会,我们都知道未定义的行为可能会带来灾难性的后果。数据包有一个析构函数,即使你看不到它。信息技术啊,下面的答案。正确的答案是你不应该删除东西。把它们包装起来。@Dmitri,valgrind可以帮你找到不匹配的地方。只要你总是使用相应的delete/free方法,我不认为把new和malloc混合在一起是个坏主意。事实上,使用malloc/realloc/free-In代码有几个原因,否则会使用new/delete(即管理应该重新分配的内部缓冲区等等)。有些人甚至可以使用其他堆管理功能(例如,windows系统上的HeapAlloc和friends)。或者编写自己的内存池。为什么不混合呢?@rstevens混合new
和malloc
——只是不匹配。但是,你应该考虑混合可能是一个问题,如果它会导致你错。谢谢。看到我在Omnifarious'post上的评论(我是自下而上阅读的)@Dmitri,我并不是建议将delete
重新定义为一个解决方案,而是指出了另一个潜在问题。我对我的答案进行了编辑,使之更清晰。如果你覆盖了全局new
和delete
,那么你必须使用malloc()
和free()
@wilhelmtell:不,你没有。您可以预先分配一块连续内存,并在其中进行自己的内存管理(即特殊内存池),也可以使用操作系统提供的一些特殊系统调用(例如