2016-04-20 18 views
9

Come è possibile utilizzare sia lo scalare che l'array nel puntatore intelligente?Utilizzo di entrambi scalare e matrice nel puntatore intelligente

Il vecchio modo di usare new e delete puntatore:

int *p; 

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

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

In puntatore intelligente, devo usare 2 punti di riferimento per ogni puntatore scalari e la matrice:

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

Come posso diminuire a utilizzare solo 1 puntatore intelligente?

+0

È possibile scrivere il proprio puntatore intelligente che memorizza un valore bool useScalar per determinare se utilizzare 'delete' o' delete [] '. – jotik

+6

Puoi allocare 'p = new int [1]' e fingere che sia un puntatore a scalare? – dasblinkenlight

+2

Potresti usare 'int [1]' come scalare, forse semplifica anche altre aree del tuo programma ... – alain

risposta

5

Se si utilizza un deleter personalizzato, è possibile utilizzare lo stesso tipo per entrambi i puntatori.

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;}, 
    }; 
}