2012-02-14 12 views
1

例外が発生した場合でも安全に削除したいポインタの配列へのポインタがあります。今すぐ配列をループし、各項目のdeleteを呼び出し、配列のdelete []を呼び出す必要があります。 auto_ptrは配列を削除するようですが、配列内の個々のポインタは削除されません。これには簡単な解決策がありますか?ポインタの配列へのポインタの安全な削除

double** desc = new MyObject*[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new MyObject(); 

for (int i=0; i<size_out; i++) 
    delete desc[i]; 
delete [] desc; 

私はあなたがしなければならないだろう何だと思うおかげ

+0

言語にタグを付けるべきです –

+1

'std :: vector'だけでなく、特別な理由がありますか? –

答えて

0

は、ポインタの配列へのポインタを取り、そのデストラクタでの洗浄を行い、スタックオブジェクトを作成することです。次のようなものがあります:

template <typename T> 
struct ArrayDeleter 
{ 
    ArrayDeleter(T** array, size_t size) 
    : m_array(array), m_size(size) 
    {} 

    ~ArrayDeleter() 
    { 
    for (size_t i = 0; i != m_size; ++i) 
    { 
     delete m_array[i]; 
    } 
    delete [] m_array; 
    } 

    T** m_array; 
    size_t m_size; 
}; 

スマートなポインタはありませんので、自分で行う必要があります。例外抵抗が目標です

0

場合は、親指の良いルールは、コンストラクタとデストラクタが例外をスローしないようにすることですthis--

for (int i=0; i<size_out; i++) 
{ 
    try 
     delete desc[i]; 
    catch(...) 
     continue; 
} 
delete [] desc; 
+2

デストラクタがスローすると、世界はとにかく終わってしまいます。 – Xeo

0

ような何かを行うべきではありません。それらをコンストラクタ/デストラクタでキャッチします。その後、個々のポインタを削除してから配列を削除することができます。