2012-03-11 17 views
1

Josuttis氏は、可能なアロケータ使用(15章)についての例を示します。このコードにはメモリリークの可能性はありますか?

void vector<T,Allocator>::reserve(size_type size) 
{ 
    //allocate new memory for size elements 
    T* newmem = alloc.allocate (size); 
    //copy old elements into new memory 
    uninitialized_copy(elems,elems+numElems,newmem); 

uninitialized_copyが失敗した場合はどうなりますか?/

template <class InputIter, class ForwIter> 
    ForwIter uninitialized_copy(lnputIter beg, InputIter end, ForwIter dest) 
    { 
    typedef typename iterator_traits<ForwIter>::value_type VT; 
    ForwIter save(dest); 
    try { 
     for (; beg!=end; ++beg,++dest) { 
      new (static_cast<void*>(&*dest))VT(*beg); 
     } 
     return dest; 
    } 
    catch (...) { 
     for (; save!=dest; ++save) { 
      save->~VT(); 
     } 
     throw; // will ::operator delete() be called to free the previously allocated memory? 
    } 
} 

答えて

2

現状では、あなたのコードますリークメモリ、およびuninitialized_copytryに含まれなければなら:任意のメモリリークはありますか魔法(以下のコード内のコメントを参照)と呼ばれる::operator deleteですcatchブロック自体。あまりにもvalgrindの通じ

T* newmem = alloc.allocate (size); 
try { /* copy, reassign pointer, free previous */ } 
catch (...) { alloc.deallocate(newmem); throw; } 
+0

C++ 11では、 'try/catch'ではなく' unique_ptr'を使うと思いますが、それは私だけです。 – ildjarn

+0

@ildjarn:* what *への一意のポインタ?ここでは、連続した 'T'オブジェクトのシーケンスを設定しています。 'unique_ptr 'おそらく? –

+0

'unique_ptr 'にカスタムディテッターがあります。 RAIIは 'try/catch'よりも賢明ではありませんか? – ildjarn

0

実行それを:周囲のコードは、独自のクリーンアップを実行できるように、コピー操作が失敗したことをアトミックに知らせることが可能であるように、コピー機能の内部で例外を再スローの全体の目的です。それに漏れがある場合、Valgrindも同様にそれらを見つけるでしょう。

関連する問題