2016-04-20 5 views
9

Wie kann ich sowohl Skalar als auch Array im Smart Pointer verwenden?Verwendung von Skalar und Array im Smart Pointer

Die alte Art und Weise der Verwendung von neuen und löschen Zeiger:

int *p; 

if (useScalar) { 
    p = new int; 
} else { 
    p = new int[10]; 
} 

if (useScalar) { 
    delete p; 
} else { 
    delete[] p; 
} 

In Smart-Pointer, ich habe 2 Zeiger für jeden Skalar und Array-Zeiger verwenden:

std::unique_ptr<int> p1(new int); 
std::unique_ptr<int[]> p2(new int[10]); 

Wie kann ich abnehmen Verwenden Sie nur einen intelligenten Zeiger?

+0

Sie können Ihren eigenen intelligenten Zeiger schreiben, der ein 'bool useScalar' speichert, um zu bestimmen, ob' delete' oder 'delete []' verwendet werden soll. – jotik

+6

Könnten Sie 'p = new int [1]' zuweisen und so tun, als wäre es ein Zeiger auf Skalar? – dasblinkenlight

+2

Sie könnten 'int [1]' als Skalar verwenden, vielleicht vereinfacht es auch andere Bereiche Ihres Programms ... – alain

Antwort

5

Wenn Sie einen benutzerdefinierten Löschvorgang verwenden, können Sie für beide Zeiger den gleichen Typ verwenden.

std::unique_ptr<int, void(*)(int*)> p = {nullptr, [](int*){}}; 
if (useScalar) { 
    p = { 
     new int, 
     [](int* p){delete p;} 
    }; 
} else { 
    p = { 
     new int[10], 
     [](int* p){delete[] p;}, 
    }; 
}