2016-04-25 8 views
0

Gibt es eine Möglichkeit zu wissen, ob der Speicher einer Zeigervariablen mit new oder malloc zugewiesen wurde?Kann ich testen, ob eine Variable mit new oder malloc zugewiesen wurde?

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));' wird nicht kompilieren. Also vielleicht ein besseres Beispiel aussuchen. Das Erstellen von Objekten (nicht nur Speicher) mit malloc ist UB, da die Konstruktoren nicht aufgerufen werden. –

+2

Nein, gibt es nicht. Die beste Lösung für dieses Problem ist, immer "neu" zu verwenden, damit es wie durch Zauberei verschwindet. – molbdnilo

+0

Klarer Fall von XY-Problem. VTC. – SergeyA

Antwort

0

Warum versuchst du es nicht mit Zählern?

Soweit ich Ihren Code verstehen sieht wie folgt aus:

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

Sie so etwas tun könnte:

#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

Dies wird nicht kompiliert. Es würde auch undicht, wenn es tat. – erip

+0

Schreckliche Idee. Asusming Kompilierungsfehler sind behoben, wie würde der Zeiger freigegeben werden? – SergeyA

+0

Ich habe den Code geändert. Das ist meine Idee, um das Problem zu lösen. –

-1

Sie könnten ein definieren verwenden, die mit NEW neue ersetzt, und dann setzen die Definition zu

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

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

Schlecht schlecht schlecht. Verwenden Sie keine Makros ... – erip

+0

Schrecklicher Vorschlag. – SergeyA

+0

Können Sie mir sagen, warum es ein schlechter Vorschlag ist? Eine Funktion wird es nicht so sauber lösen wie dies wäre –