参照を戻り値とする場合の質問 – プログラミング – Home

参照を戻り値とする場合の質問
 
通知
すべてクリア

参照を戻り値とする場合の質問


拓也
 拓也
(@拓也)
ゲスト
結合: 17年前
投稿: 1
Topic starter  

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);
}
}


引用解決済
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

個人的には、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の中なのでお好みで。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

たいちうさんの意見に一票。
基本的にnewとdeleteはセットで同じ階層にあった方が解りやすいし、
delete漏れが起こりにくいと思います。
newする必要が特に無いならローカルにインスタンスを作成した方が
開放漏れが防げるので良いと思う。
ローカルならスコープが外れた時点で開放されますからね。

配列に値を入れる事が目的なら関数自体はそれに徹した方が良いと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました