実体 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;
        }
};

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++で導入された参照返し(&を使う)は使用不可(メソッド内で実体を作ってそれを参照返ししようとしてもスコープからはずれるので、実体は既に消去されてしまっていて、コンパイラエラーになる)なので、困ったものです。

January 02, 2004 23:46 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする