C++ 在内存管理中调用的有效构造函数

C++ 在内存管理中调用的有效构造函数,c++,memory,memory-management,malloc,new-operator,C++,Memory,Memory Management,Malloc,New Operator,我编写了自己的内存库,它可以帮助我避免内存泄漏和碎片问题。一切正常。主要的问题是它对类无效。当我调用我的_alloc(size)时,如果构造函数存在,我想自动调用它。我可以在不重载新运算符的情况下执行此操作吗?您可以在分配的内存上使用,在不让new执行分配的情况下调用构造函数 重载new有什么问题?您可以在分配的内存上使用,在不让new进行分配的情况下调用构造函数 ?< /p> < p>检查C++的实现有什么不对?其中一些(我认为G++编译器会这样做)调用C运行时malloc,为new获取内存,

我编写了自己的内存库,它可以帮助我避免内存泄漏和碎片问题。一切正常。主要的问题是它对类无效。当我调用我的_alloc(size)时,如果构造函数存在,我想自动调用它。我可以在不重载新运算符的情况下执行此操作吗?

您可以在分配的内存上使用,在不让
new
执行分配的情况下调用构造函数

重载
new
有什么问题?

您可以在分配的内存上使用,在不让
new
进行分配的情况下调用构造函数


<重载<代码>新的< /代码>?< /p> < p>检查C++的实现有什么不对?其中一些(我认为G++编译器会这样做)调用C运行时
malloc
,为
new
获取内存,然后调用构造函数


如果你有这些实现,你需要做的就是正确地覆盖标准库Malc和FieldFuns(读取库内部文档),C++将自动工作。< /P> < P>检查C++的实现。其中一些(我认为G++编译器会这样做)调用C运行时

malloc
,为
new
获取内存,然后调用构造函数



如果您有这些实现之一,那么您所需要做的就是正确地重写标准库malloc和free函数(阅读库内部文档)C++会自动工作。这取决于你需要发布更多的API。我怀疑你自己的内存库在你的操作系统提供的MALLC实现上没有真正的改进。@ DeimMG:它是一种线性分配器。如果不详细说明,则与此类似:void*memory\u pool=malloc(10000);void*my_alloc(size){return first_free_section_in_memory_pool;}我怀疑它隐藏而不是避免内存泄漏。标准内存管理器已经开发了20多年,它相当不错。如果没有同等的工作量,您不可能改进它(即,您已经落后于曲线30人年)。这取决于-您需要发布更多的API。我怀疑您自己的内存库并没有真正改进操作系统提供的malloc实现。@DeadMG:这是一种线性分配器。如果不详细说明,则与此类似:void*memory\u pool=malloc(10000);void*my_alloc(size){return first_free_section_in_memory_pool;}我怀疑它隐藏而不是避免内存泄漏。标准内存管理器已经开发了20多年,它相当不错。在没有同等工作量的情况下(即,你已经落后于曲线30人年),你不太可能在这方面有所改进。没有法律途径可以推翻malloc/free@Martin:许多库提供了专门设计的钩子,以允许重写malloc和free。@Martin:glibc提供了\uuu malloc\u钩子、\uu realloc\u钩子、\uu free\u钩子、,等等@Martin:我还认为glibc函数被定义为弱函数,这允许它们被任何其他同名函数覆盖。这可以让你加载自己的malloc库。@Zan Lynx:只要你用心去做,任何事情都是可能的。这并不意味着它是合法的。没有合法的方法来推翻malloc/free@Martin:许多库提供了专门设计的钩子,以允许重写malloc和free。@Martin:glibc提供了\uuu malloc\u钩子、\uu realloc\u钩子、\uu free\u钩子等。@Martin:我还认为glibc函数被定义为弱函数,这允许它们被具有相同名称的任何其他函数重写。这可以让你加载自己的malloc库。@Zan Lynx:只要你用心去做,任何事情都是可能的。这并不意味着它是合法的。谢谢!正是我需要的。重载new并没有错,但我有一些细节说明为什么我不能这么做。其中之一是,由于我的应用程序的特殊性,我一次使用了几个“内存模块”。因此,当我调用我的_alloc(ctx,size)时,我总是需要传递一个“ctx”作为参数。这就是为什么我不能让“新”超负荷工作的原因。@Oleg:错误的假设;重载
new
时,可以添加额外的参数。因此您可以调用
T*ptr=new(ctx)T(ctorArgs)谢谢!正是我需要的。重载new并没有错,但我有一些细节说明为什么我不能这么做。其中之一是,由于我的应用程序的特殊性,我一次使用了几个“内存模块”。因此,当我调用我的_alloc(ctx,size)时,我总是需要传递一个“ctx”作为参数。这就是为什么我不能让“新”超负荷工作的原因。@Oleg:错误的假设;重载
new
时,可以添加额外的参数。因此您可以调用
T*ptr=new(ctx)T(ctorArgs)