実体 vs ポインタ
仕事の関係でC++を書いています。疑問に引っかかりました。
class Hoge{
private:
vector<string> spool;
public:
vector<string> *getSearchResult(const Condition &cnd) const{
vector<string> *result = new vector<string>;
for(vector<string>::const_iterator target = spool.begin();
target != spool.end();
target++){
if(cnd.match(*target)) result->push_back(*target);
}
return result;
}
};
private:
vector<string> spool;
public:
vector<string> *getSearchResult(const Condition &cnd) const{
vector<string> *result = new vector<string>;
for(vector<string>::const_iterator target = spool.begin();
target != spool.end();
target++){
if(cnd.match(*target)) result->push_back(*target);
}
return result;
}
};
class Hoge2{
private:
vector<string> spool;
public:
vector<string> getSearchResult(const Condition &cnd) const{
vector<string> result;
for(vector<string>::const_iterator target = spool.begin();
target != spool.end();
target++){
if(cnd.match(*target)) result.push_back(*target);
}
return result;
}
};
要約するとこういうことです。メンバメソッドgetSearchResultを比較してください。上のHogeクラスのほうでは、検索結果としてvectorのポインタを返しているのに対して、下のHoge2クラスのではvectorの実体を返しています。
利点と欠点を整理すると、Hogeのほうではポインタを返すためにオーバーヘッドが発生せず高速処理が可能なかわりに、caller(メソッドを呼び出す側)で責任を持ってメモリを開放(delete)してやる必要があります(忘れると致命的なバクになりかねない)。一方Hoge2のほうでは実体を返すために、メモリの開放が不要(スコープから抜ければ自動的にメモリが開放される)でメモリリークの心配がないが、コピーを作成するためにスピードを犠牲にしています。
どっちがいいんでしょうか。多分、これは思想の問題で、状況によって答えがかわってくると思いますが。
自分が全てデバックできる範囲のプログラムでしたら間違いなくポインタ方式(Hoge方式)をとるでしょうか、他の人が使うライブラリを書く場合は実体方式(Hoge2方式)を使用したほうが無難ではないかと現在のところ思っています。このような場合はC++で導入された参照返し(&を使う)は使用不可(メソッド内で実体を作ってそれを参照返ししようとしてもスコープからはずれるので、実体は既に消去されてしまっていて、コンパイラエラーになる)なので、困ったものです。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。