2016-04-25 52 views
0

有没有办法知道指针变量的内存是使用new还是malloc分配的?我可以测试一个变量是使用new还是malloc分配的?

int* a = new int; 
int* b = static_cast<int*>(malloc(sizeof *b)); 

//Maybe using a function? 
allocatedwithnew(a); //Returns true 
allocatedwithmalloc(b); //Return true 
+1

'A obj3 = malloc(sizeof(int));'不会编译。所以可能会选择一个更好的例子。用malloc创建对象(不仅仅是存储)是UB,因为构造函数不会被调用。 –

+2

不,没有。解决这个问题的最佳方法是始终使用'new',使它像魔术般消失。 – molbdnilo

+0

清除XY问题。 VTC。 – SergeyA

回答

0

为什么不试试计数器?

据我理解你的代码看起来是这样的:

if(ConditionA) { 
    A obj = new A; 
} else { 
    A obj = malloc(sizeof(int)); 
} 

你可以做这样的事情:

#include <iostream> 
#include <stdlib.h> 

using namespace std; 

struct A{ 
    int ab; 
    bool createdByNew; 
}; 

int main() 
{ 
    int CountNewAllocations=0; 
    int CountMallocAllocations=0; 
    bool Condition=true; // this will be set to appropriate value 

    A *obj = NULL; 

    if(Condition) { 
     obj = new A; 
     obj->createdByNew=true; 
     CountNewAllocations++; 
    } else { 
     obj = (A*) malloc(sizeof(A)); 
     obj->createdByNew=false; 
     CountMallocAllocations++; 
    } 

    // ... use the object 

    if(obj!=NULL) { 
     if(obj->createdByNew) { 
     delete obj; 
     CountNewAllocations--; 
     } else { 
     free(obj); 
     CountMallocAllocations--; 
     } 
    } 

    return 0; 
} 
+0

这不会编译。如果有的话,它也会泄漏。 – erip

+0

可怕的想法。纠错编译错误是固定的,指针如何释放? – SergeyA

+0

我更改了代码。这是我解决问题的想法。 –

-1

你可以使用一个定义它取代新新的,然后设置定义为

static int newCounter = 0; 
#define NEW(A) ++newCounter; new A 

static int mallocCounter = 0; 
#define MALLOC(A) ++malloCounter; malloc A 
+0

坏坏坏。不要使用宏... – erip

+0

糟糕的建议。 – SergeyA

+0

你能告诉我为什么这是一个不好的建议吗?一个函数不会像它那样整齐地解决它 –

相关问题