次のようなコードがあります。 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;
}
コンストラクタのパラメータのデフォルト値は何ですか? –