2016-04-20 3 views
9

Как использовать скаляр и массив в интеллектуальном указателе?Использование скаляра и массива в умном указателе

старый способ использования новых и удаления указателя:

int *p; 

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

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

В смарт-указатель, я должен использовать 2 указателя для каждого скалярного и массив указателей:

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

Как можно уменьшить до использовать только 1 умный указатель?

+0

Вы можете написать собственный смарт-указатель, в котором хранится 'bool useScalar' для определения того, следует ли использовать' delete' или 'delete []'. – jotik

+6

Не могли бы вы выделить 'p = new int [1]' и притвориться, что это указатель на скаляр? – dasblinkenlight

+2

Вы можете использовать 'int [1]' как скаляр, возможно, он упрощает другие области вашей программы ... – alain

ответ

5

Если вы используете пользовательский дебетер, вы можете использовать тот же тип для любого указателя.

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