对运营商'delete'的调用是否同步?

Ale*_*aev 18 c++ asynchronous memory-management

我想知道对运营商的呼叫delete是否同步.换句话说,如果我这样做:

delete p;
Run Code Online (Sandbox Code Playgroud)

C++标准是否保证只有在此调用完成执行后才释放内存?或者是调用是异步的,并且只要它决定最好的时间,它就会安排OS的任务释放这个内存吗?

如果第一种情况是有效的,那么它是否意味着我们必须实现我们自己的异步删除工具?我问,因为我会说大多数时候我们(程序员)不关心内存是否完全释放,因此我们不希望我们的代码冻结并等待这个(最有可能是昂贵的?)系统调用完成,而是安排删除任务并立即继续执行.C++是否提供任何标准功能(可能通过标准库?)来完成此操作而无需重新发明轮子?

Kon*_*lph 18

delete是同步的.现在,这并不意味着操作系统当时实际释放了底层内存,但从C++系统的角度来看,它的行为就好像.

我问,因为我会说大多数时候我们(程序员)不关心内存是否完全释放

delete主要不是关于内存,它同样以确定性的方式调用析构函数 - 它是一种通用的资源释放机制,不仅限于内存.这里,它有同步重要的,否则的C++核心方面之一- RAII -是行不通的.


Jer*_*fin 7

没有什么能保证delete p;将内存释放回操作系统 - 永远.事实上,在很多(大多数?)实现中,它不会做任何类似的事情.

当你调用时确实发生了多少delete变化 - 在某些情况下它几乎是即时的(只是将块链接到空闲内存块列表).在其他情况下,它确实做了更多工作:销毁对象,并且可能搜索当前空闲列表中的相邻块,这些块可以与被释放的块合并.