2012-04-10 5 views
1

Я слышал, что он упоминал пару раз, что std::vector не является безопасным при сохранении исходных указателей, и вместо этого следует использовать unique_ptr или shared_ptr.std :: vector не исключение-сейф?

Мой вопрос в том, почему std::vector не является безопасным для исключений и как эти классы исправляют это?

+5

Do ** not ** использовать 'std :: auto_ptr <>' в стандартных классах коллекции. 'std :: unique_ptr <>' и 'std :: shared_ptr <>' являются безопасными, но никакой умной указатель в стандартной библиотеке C++ 03 нет. – ildjarn

+0

Безопасность исключений не зависит от того, что хранит вектор. – Jon

+0

@ildjarn Я думаю, это то, что я хотел сказать, я не могу найти, где я видел упоминание, поэтому я не могу дважды проверить. Я все равно редактировал вопрос. – SirGuy

ответ

5

Это не std::vector, что это не безопасно исключение, он использует сырые указатели для управления памятью:

int main() 
{ 
    try 
    { 
     int* i = new int; 

     throw "oops, memory leak!"; 
    } 
    catch (...){} 
} 

Это не имеет ничего общего с Вектора по сути, это просто, что делает это та же самая проблема:

int main() 
{ 
    try 
    { 
     std::vector<int*> vi; 
     vi.push_back(new int); 

     throw "oops, memory leak!"; 
    } 
    catch (...){} 
} 

Оба эти фиксируются с помощью смарт-указатели:

int main() 
{ 
    try 
    { 
     std::unique_ptr<int> i(new int); 

     std::vector<std::unique_ptr<int>> vi; 
     vi.push_back(std::unique_ptr<int>(new int)); 
     vi.push_back(std::move(i)); 

     throw "vector destroys unique_ptr's...which delete their memory"; 
    } 
    catch (...){} 
} 

(или shared_ptr, что дороже. Вы также можете использовать контейнеры-указатели от Boost.)

+0

Это, скорее всего, случай. Хороший звонок. –

2

Под «небезопасным исключением» я предполагаю, что они означают, что произойдет утечка памяти, если вектор будет уничтожен путем размотки во время исключения.

Shared_ptr гарантирует, что объекты, на которые указывают указатели, удаляются при уничтожении самого вектора.

Другой альтернативой является Boost pointer containers.

Смежные вопросы