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:不,你没有。您可以预先分配一块连续内存,并在其中进行自己的内存管理(即特殊内存池),也可以使用操作系统提供的一些特殊系统调用(例如