如何检查是不是使用 malloc 或 new 分配了内存
Posted
技术标签:
【中文标题】如何检查是不是使用 malloc 或 new 分配了内存【英文标题】:how to check if memory is allocated using malloc or new如何检查是否使用 malloc 或 new 分配了内存 【发布时间】:2014-05-12 16:52:25 【问题描述】:我正在处理一些使用malloc
和new
分配内存的遗留C/C++ 代码。我想创建一个通用包装函数来使用 free
或 delete []
释放内存,具体取决于它的分配方式。
有没有办法确定内存是如何分配的?这是一个伪代码。
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_ptr
、std::shared_ptr
)。
另外,订购nine-tail cat 并鞭笞负责造成混乱的人。
【讨论】:
哈哈……他们早就离开了,但我肯定会订购一个 ;-) 这是 *** 史上最暴力的回答! :-D【参考方案2】:您可以自己实现malloc()
,而不是使用标准库提供的实现。您还可以重载运算符new
和delete
。没有什么可以阻止您将自己的簿记添加到这些实现中,所以是的,这是完全可能的。
推荐吗?不,不是。
这有点实现垃圾收集的尝试。如果这是真的,那么您正在以错误的方式看待 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)区别与注意