如何检查是不是使用 malloc 或 new 分配了内存

Posted

技术标签:

【中文标题】如何检查是不是使用 malloc 或 new 分配了内存【英文标题】:how to check if memory is allocated using malloc or new如何检查是否使用 malloc 或 new 分配了内存 【发布时间】:2014-05-12 16:52:25 【问题描述】:

我正在处理一些使用mallocnew 分配内存的遗留C/C++ 代码。我想创建一个通用包装函数来使用 freedelete [] 释放内存,具体取决于它的分配方式。

有没有办法确定内存是如何分配的?这是一个伪代码。

double *x;
double *y;
x = (double *) malloc(size);
y = new double [size]

doSomething();
deallocateMemory(x, y);

我想让deallocateMemory 确定是调用free 还是delete []。任何帮助,将不胜感激。

【问题讨论】:

据我所知,你不能这样做。 ***.com/questions/9702292/… 您应该在类型系统中使用 std::unique_ptr 和适当的删除器对其进行编码。 经常new是直接转发到malloc和delete到free。结果,所有内存都使用 malloc 分配,这完全没有问题。我看不出你在做什么的意图。你能解释一下吗?或者您是否尝试在释放内存的同时手动调用析构函数?这是个坏主意! 如果您不能按照@DevSolar 的回答中的建议更改实际的malloc() 实现,我能想到的是用一个c++ 接口API 来包装所有遗留API,以跟踪正在发生的事情上,什么来自哪里。我将此作为评论发布,因为如果不了解有关旧 API 的更多详细信息,适当的答案会变得非常广泛。 【参考方案1】:

在获得所有权后立即将原始指针包装在适当的智能指针中(例如std::unique_ptrstd::shared_ptr)。

另外,订购nine-tail cat 并鞭笞负责造成混乱的人。

【讨论】:

哈哈……他们早就离开了,但我肯定会订购一个 ;-) 这是 *** 史上最暴力的回答! :-D【参考方案2】:

您可以自己实现malloc(),而不是使用标准库提供的实现。您还可以重载运算符newdelete。没有什么可以阻止您将自己的簿记添加到这些实现中,所以是的,这是完全可能的。

推荐吗?不,不是。

这有点实现垃圾收集的尝试。如果这是真的,那么您正在以错误的方式看待 C++。 C++确实有它的清理工具,就是它的析构函数。指针容器有现成的实现,它们在它们的析构函数中清理分配的内存。其他人提到过,我不会从其他人的答案中复制粘贴。

【讨论】:

当问题是意大利面条时,解决方案最好非常简单——实现簿记分配大约是最复杂的。在另一个类似问题的答案中,它被尝试过,而且非常非常不正确。很有可能,如果 OP 尝试这样做,只会加剧问题,并浪费大量时间。 @DevSolar:实际上,我正在尝试清理由于操作加载的运算符而导致的许多问题!所以,正如你所说的那样,我不会走那条路。遗留代码有几个令人费解的 malloc / new 分配,考虑到代码的大小,它们的来源很难/很耗时。所以我正在检查是否有任何方法可以查询内存是如何分配的。【参考方案3】:

你想写

一个用于释放内存的通用包装函数

那么你需要写

一个通用的包装函数来分配内存

而且,完全不推荐。尽量让你的目标干净。如果您必须在代码的某些部分处理malloc/free 指针并且您不能修改malloc 部分,那么请尽量不要将该部分与您的new/delete 部分混合。

否则,您没有标准方法来确定指针使用哪种分配方法。

【讨论】:

当问题是意大利面条时,解决方案最好非常简单——实现簿记分配大约是最复杂的一个。在另一个类似问题的答案中,它被尝试过,而且非常非常不正确。很有可能,如果 OP 尝试这样做,只会加剧问题,并浪费大量时间

以上是关于如何检查是不是使用 malloc 或 new 分配了内存的主要内容,如果未能解决你的问题,请参考以下文章

检查指针是不是指向堆上分配的内存

C++中new出得对象与C中的malloc出得有啥联系和区别?

内存分配(malloc,new,VirtualAlloc,HeapAlloc,GlobalAlloc,LocalAlloc)区别与注意

何时使用 Malloc 而不是 New [重复]

关于new的堆栈问题

删除/释放由 malloc 分配并由 new [重复] 重用的内存