2010-12-06 5 views
-1

次のようなコードがあります。 MemReleaseクラスというクラスを使用してRAIIを実現しようとしています。さて、FXOMemReleaseはsample.ccに示されている方法で使用されています。C++でのメモリリリースの問題

FXOMemRelaseのようなオブジェクトを使っても問題ありませんか?ほとんどの場合、MemReleaseのデストラクタはMakeString()が完了した後にのみ呼び出されることがわかります。それは結構です。
いつもそうでしょうか?メモリの問題があり、最後にMemReleaseクラスのprint文を指し示すトラスの出力があります。

MemRelease.cpp

template<typename T> 
MemRelease<T>::MemRelease(T* store, unsigned char array_yesno, short release_yesno) 
     : ptr(store), array(array_yesno), release(release_yesno) 
{ 
} 


template<typename T> 
T* MemRelease<T>::getStore() 
{ 
     return (ptr); 
} 

template<typename T> 
MemRelease<T>::~MemRelease() 
{ 
     if (!release) return; 
     if ((array == 'Y') || (array == 'y')) 
     { 
       cout << "deleting array in MemRelease pid = " << getpid() << endl; 
       delete [] ptr; 
       ptr = NULL; 
     } 
     else 
     { 
       cout << "deleting memory in MemRelease pid = " << getpid() << endl; 
       delete ptr; 
       ptr = NULL; 
     } 
} 

Sample.cc:

char* MakeString(char* str) 
{ 
    cout << "Entered MakeString\n"; 
    char* newstr = new char[strlen(str) + 1]; 
    strcpy(newstr, str); 
    return str; 
} 
int main() 
{ 
    char *str = new char[10]; 
    strcpy(str, "jagan"); 
    char* newstr = MakeString(MemRelease<char>(str).getStore()); 

    getchar(); 
    delete newstr; 
} 
+1

コンストラクタのパラメータのデフォルト値は何ですか? –

答えて

1

ほとんどの場合、MemReleaseのデストラクタはMakeString()が完了した後にのみ呼び出されることがわかります。それは結構です。いつもそうだろうか?

はい、常にあります。一時オブジェクトはnewstrへの割り当てが完了するまで有効です。

afrizaは、コンストラクタのarray_yesnorelease_yesnoのデフォルト値を含めていないため、どの破壊コードが実行されているかを確認することはできません。ところで、boolと呼ばれるタイプがあります。これは、yes/no値に使用する必要があります。

+0

Afriza :-)はい私はブールと文字列を認識しています。いつかそれが周りに横たわっているコードであるという事実は、私は今それを変更することはできません。とにかく、私は私の質問の答えを得た。ありがとう。 – Jagannath

+0

心配する必要はありません...古いコードで作業すると痛いことがあります...幸運! –

+0

あなたにとって幸運です。私は* NEW *コードを扱っていますが、他のプログラマーはstd :: stringやboost :: * --sigh--の代わりに新しい[]、delete []、char * –

3

代わりのdeleteを使用して、新しい[]を使用してメモリを割り当てているので、delete[]を使用しています。

C++を使用しているので、std::stringまたはboost::scoped_ptrboost::scoped_arrayとその友人を使ってみませんか?