InsertArray()内でnew演算子を使用した場合
メモリの開放(deleteの呼び出し)はどうするのがC++流でしょうか?
(初歩的な質問ですがよろしくお願いします.)
CArray<int, int&>& InsertArray()
{
CArray<int, int&>* intArray = new CArray<int, int&>;
for(int i = 0; i < 10; i ++)
{
(*intArray).Add(i);
}
(*intArray).ElementAt(5) = 10;
return *intArray;
}
void CSample67View::OnButton1()
{
CArray<int, int&>& intArr = InsertArray();
int nCount;
char szBuf[512];
for(int i = 0; i < 10; i ++)
{
wsprintf(szBuf, %d\n, intArr.GetAt(i));
OutputDebugString(szBuf);
}
intArr.ElementAt(5) = 5000;
for(i = 0; i < 10; i ++)
{
wsprintf(szBuf, %d\n, intArr.GetAt(i));
OutputDebugString(szBuf);
}
}
個人的には、newとdeleteが離れたところにあるのは、できるだけ避けたい。
intArrを使うのがOnButton1()の中だけなら、こんな感じ。
void InsertArray(CUIntArray &array)
{
for (int i = 0; i < 10; i++)
array.Add(i);
array.ElementAt(5) = 10;
}
呼び出す方:
CUIntArray uintArr;
InsertArray(uintArr);
char szBuf[512];
for (int i = 0; i < 10; i++) {
wsprintf(szBuf, %d\n, uintArr.GetAt(i));
OutputDebugString(szBuf);
}
uintArr.ElementAt(5) = 5000;
for (int i = 0; i < 10; i++) {
wsprintf(szBuf, %d\n, uintArr.GetAt(i));
OutputDebugString(szBuf);
}
ちなみに使いたいのがint型なので、MFCが用意しているCUIntArrayを使っている。
vector<int>の方が良いかもしれないけど、MFCの中なのでお好みで。
たいちうさんの意見に一票。
基本的にnewとdeleteはセットで同じ階層にあった方が解りやすいし、
delete漏れが起こりにくいと思います。
newする必要が特に無いならローカルにインスタンスを作成した方が
開放漏れが防げるので良いと思う。
ローカルならスコープが外れた時点で開放されますからね。
配列に値を入れる事が目的なら関数自体はそれに徹した方が良いと思います。