2014-05-12 39 views
2

我正在处理一些遗留的C/C++代码,其中内存分配使用malloc以及使用new。我想创建一个通用包装函数来取消分配内存使用freedelete [],取决于它如何分配。如何检查内存是否使用malloc或新分配

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

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

doSomething(); 
deallocateMemory(x, y); 

我想deallocateMemory以确定是否调用freedelete []。任何帮助,将不胜感激。

+4

据我所知,你不能这样做。 –

+1

http://stackoverflow.com/questions/9702292/overriding-malloc-to-log-allocation-size –

+2

你应该在类型系统中使用'std :: unique_ptr'和适当的删除器对它进行编码。 – Mankarse

回答

2

只要您拥有所有权,就将原始指针包装在适当的智能指针中(例如std::unique_ptrstd::shared_ptr)。

此外,订购一个nine-tail cat和flog负责这个烂摊子的人。

enter image description here

+0

LOL ...他们早就离开了,但我要确定一个;-) – cppb

+0

这是StackOverflow历史上最猛烈的答案! :-D – deepmax

5

你可以自己实现malloc()而不是使用标准库提供的实现。您也可以使运营商newdelete超载。没有什么能够让你将自己的簿记添加到这些实现中,所以是的,这是完全可能的。

是否建议使用?不,它不是。

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

+0

当问题是意大利面时,解决方案最好是非常简单 - 实施簿记分配是最复杂的。在另一个类似的问题的答案是试图,而且非常非常不正确。如果OP尝试这样做,很可能会加剧问题,浪费大量时间。 –

+0

@DevSolar:其实我试图清理由于运算符操作而导致的问题!所以,正如你所说的,我不会走这条路。遗留代码有几个令人费解的malloc/new分配,它们的起源在给定代码大小的情况下难以追踪/耗时。因此,我正在检查是否有任何方法来查询分配内存的方式。 – cppb

1

你想写

广义包装函数解除分配内存

,那么你需要写

广义包装功能分配内存

而且,它根本不被推荐。尽量让你的目标干净。如果您必须在代码的某个部分处理malloc/free指针,并且您无法修改malloc部件,请尽量不要将该部件与您的new/delete部件混合使用。

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

+0

当问题是意大利面时,解决方案应该最好非常简单 - 实施簿记分配是最复杂的一个。在另一个类似的问题的答案是试图,而且非常非常不正确。如果OP尝试这样做,很可能会加剧问题,浪费大量时间 –