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

3
我正在处理一些遗留的C/C++代码,其中内存是使用mallocnew进行分配的。我想创建一个通用的包装函数,可以根据内存分配方式使用freedelete []来释放内存。

有没有一种方法可以确定内存是如何分配的?以下是伪代码:

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

doSomething();
deallocateMemory(x, y);

我希望deallocateMemory能够确定是调用free还是delete []。任何帮助将不胜感激。


4
据我所知,你不能做这件事。 - Baum mit Augen
1
http://stackoverflow.com/questions/9702292/overriding-malloc-to-log-allocation-size - 001
2
你应该使用适当的删除器将其编码到类型系统中,使用std::unique_ptr - Mankarse
通常情况下,new 直接对应 malloc,而 delete 对应 free。因此,所有内存都是使用 malloc 分配的,这并不是问题。我看不出你在做什么。你能解释一下吗?或者你试图在释放内存时手动调用析构函数吗?那是个坏主意! - Klaus
如果您无法像@DevSolar的答案建议的那样更改实际的malloc()实现,我所能想到的是使用C++接口API将所有遗留API封装起来,以跟踪正在发生的事情以及来自哪里的内容。我将其发布为评论,因为在不了解有关遗留API的更多详细信息之前,适当的答案将变得非常广泛。 - πάντα ῥεῖ
3个回答

6

一旦你拥有了所有权,请尽快将原始指针包装在适当的智能指针中(例如std::unique_ptrstd::shared_ptr)。

此外,请订购九尾猫鞭,并抽打造成这个混乱的人。

enter image description here


LOL... 他们早就走了,但我肯定会订购一个;-) - cppb
这是StackOverflow历史上最激烈的回答!:-D - masoud

6
您可以自己实现malloc()而不使用标准库提供的实现。您也可以重载运算符newdelete。这些实现都可以添加您自己的记账,所以是完全可行的。但不建议这样做。
这似乎是一种尝试实现垃圾回收机制的方法。如果是这样,您可能从错误的角度看待C++。 C++确实有其清理功能,即其析构函数。有现成的指针容器实现,在其析构函数中清理分配的内存。其他人已经提到了它们,我不会从其他人的答案中复制粘贴。

当问题非常复杂时,解决方案最好是非常简单的 - 实施记账分配可能是最复杂的解决方案之一。在另一个类似的问题的答案中,曾经尝试过这种方法,但非常不正确。如果提问者尝试这样做,很可能只会加剧问题,并浪费大量时间。 - Cheers and hth. - Alf
@DevSolar:实际上,我正在尝试清理由于重载运算符而导致的混乱,这导致了许多问题!所以,正如你正确地说的那样,我不会走那条路。遗留代码有几个复杂的malloc/new分配,其起源很难/耗时追踪,考虑到代码的规模..所以我在查看是否有任何方法来查询内存是如何分配的。 - cppb

2

如果你想编写一个通用的包装函数来释放内存,那么你需要编写一个通用的包装函数来分配内存。但是,这种方法并不推荐。尽量使你的目标清晰明确。如果你必须在代码的某个部分处理malloc/free指针,并且不能修改malloc部分,则请尝试不要将该部分与new/delete部分混合使用。

否则,你就无法确定指针使用了哪种分配方法。


当问题很复杂时,解决方案最好是非常简单的--实施簿记分配是最复杂的解决方案之一。在另一个类似的问题的答案中,曾经尝试过这种方法,但结果非常不正确。如果提问者尝试这种方法,很可能只会加剧问题,并浪费大量时间。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接