就各自的语言标准而言,C仅通过malloc()族提供动态内存分配,而在C++中,最常见的分配形式是由::operator new().C风格的malloc也有C++版本,许多"baby的第一个分配器"示例使用它作为其核心分配函数,但我很好奇当代编译器如何实现实际的生产操作符 - new.
它只是一个薄的包装器malloc(),或者由于与典型的C程序相比,典型的C++程序的内存分配行为有很大不同,它是否会根本不同地实现?
[ 编辑:我认为主要区别通常描述如下:AC程序具有更少,更大,更长寿的分配,而C++程序具有许多小的短期分配.如果错误的话,请随意加入,但听起来有人会考虑到这一点.
对于像GCC这样的编译器,只需要一个单独的核心分配实现并将其用于所有相关语言就很容易,因此我想知道在每种语言中尝试优化分配性能的细节是否存在差异.
更新:感谢所有的好答案!看起来在GCC中这完全由ptmalloc解决,而且MSVC也在malloc核心使用.有谁知道MSVC-malloc是如何实现的?
现在,我试图让两个开源项目一起(OBS和OpenCV的)工作,但我遇到一个问题就在这里.
据我所知,OBS会覆盖new和delete功能.而且它与OpenCV中的对象不相处.它导致一些我无法理解的分段错误.
那么可以在代码的某个部分使用默认的new和delete函数吗?在我的项目中OpenCV的使用仅限于一个线程,所以如果可以告诉编译器我想使用默认的new和删除某个函数那么它应该没问题.我想知道是否可以用命名空间做这样的事情,但我根本不熟悉C++,所以我不知道如何做到这一点.
为了详细说明我面临的问题,我使用的是OpenCV 2.4.11(尝试3.0.0,但基本上是相同的情况),Win 7 x64下的Visual Studio 2013.当我动态地将库链接到OBS时,面部检测线程(我需要调用OpenCV)在删除某些对象时会产生分段错误.当我静态链接库(来自其他人的建议)时,程序在一些动态初始化中在OpenCV代码内启动时崩溃,因为自定义内存管理器尚未初始化.
还有其他问题与我面临的问题很接近,但似乎并没有解决问题.我将链接保留在这里: 忽略全局覆盖的新/删除, 库强制全局重载new/delete对我!
我正在使用的OBS链接在这里 https://github.com/jp9000/OBS/commit/9ab069c961c768fcdbc53b8ab2cd58540e1ee1f0
c++ opencv operator-overloading new-operator delete-operator
有没有办法在堆上获得以前分配的内存的大小?
例如:
//pseudo-code
void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);
Run Code Online (Sandbox Code Playgroud) 是否可以防止在代码中的某些点使用new?
我正在开发的遗留代码要求在引导程序完成后没有动态内存分配.我们现在想测试一下.
如果我从头开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载operator new.
有没有办法重载全局新的然后调用它?
我试图了解新的运算符重载,同时我对此深感困惑,我的问题在这里?
关于全局过载我找到了这个链接 如果我超载它怎么称呼原来的"operator new"?,但我的本地重载新运营商呢.如果有人对我的问题作出澄清,那对我来说太过分了.
除此之外,我需要知道哪个是本地或全局超载新运营商的最佳方式(可能取决于我的设计)仍然需要了解最佳设计和性能目的.谢谢是提前