相关疑难解决方法(0)

在流行的实现中,C和C++中的动态内存分配是否不同?

就各自的语言标准而言,C仅通过malloc()族提供动态内存分配,而在C++中,最常见的分配形式是由::operator new().C风格的malloc也有C++版本,许多"baby的第一个分配器"示例使用它作为其核心分配函数,但我很好奇当代编译器如何实现实际的生产操作符 - new.

它只是一个薄的包装器malloc(),或者由于与典型的C程序相比,典型的C++程序的内存分配行为有很大不同,它是否会根本不同地实现?

[ 编辑:我认为主要区别通常描述如下:AC程序具有更少,更大,更长寿的分配,而C++程序具有许多小的短期分配.如果错误的话,请随意加入,但听起来有人会考虑到这一点.

对于像GCC这样的编译器,只需要一个单独的核心分配实现并将其用于所有相关语言就很容易,因此我想知道在每种语言中尝试优化分配性能的细节是否存在差异.


更新:感谢所有的好答案!看起来在GCC中这完全由ptmalloc解决,而且MSVC也在malloc核心使用.有谁知道MSVC-malloc是如何实现的?

c c++ memory-management

56
推荐指数
4
解决办法
3815
查看次数

在全局覆盖时,在C++中使用默认的new/delete运算符?

现在,我试图让两个开源项目一起(OBS和OpenCV的)工作,但我遇到一个问题就在这里.

据我所知,OBS会覆盖newdelete功能.而且它与OpenCV中的对象不相处.它导致一些我无法理解的分段错误.

那么可以在代码的某个部分使用默认的newdelete函数吗?在我的项目中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

5
推荐指数
0
解决办法
229
查看次数

了解堆上保留内存的大小

有没有办法在堆上获得以前分配的内存的大小?
例如:

//pseudo-code

void* p = operator new (sizeof(int) * 3);
unsigned size = getSomeHow(p);  
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
2
解决办法
429
查看次数

我怎么能禁止在C++代码的某些部分使用"new"?

是否可以防止在代码中的某些点使用new?

我正在开发的遗留代码要求在引导程序完成后没有动态内存分配.我们现在想测试一下.

如果我从头开始开发,那么我可以编写自己的包装器并使用它,或者在公共基类中重载operator new.

有没有办法重载全局新的然后调用它?

c++ memory memory-management new-operator

2
推荐指数
1
解决办法
231
查看次数

如何在重载的新运算符中使用new运算符?

我试图了解新的运算符重载,同时我对此深感困惑,我的问题在这里?

  1. 我如何在全局和本地的重载新运算符中使用新运算符.

关于全局过载我找到了这个链接 如果我超载它怎么称呼原来的"operator new"?,但我的本地重载新运营商呢.如果有人对我的问题作出澄清,那对我来说太过分了.

除此之外,我需要知道哪个是本地或全局超载新运营商的最佳方式(可能取决于我的设计)仍然需要了解最佳设计和性能目的.谢谢是提前

c++ operator-overloading new-operator

2
推荐指数
1
解决办法
539
查看次数