3

動的に割り当てられ、ヒープを使用しているメモリは、delete を使用して手動で削除する必要があることを知っています。これは、スコープ外になるクラス関数で動的オブジェクトが作成された場合にも当てはまりますか? ここにスニペットがあります。

    Fraction* Fraction::add(const Fraction* fr) const{ 
      int gcd;
      Fraction* temp;

      gcd = gcdRecur(num * fr->denom + fr->num * denom, 
                     denom * fr->denom);

      temp = new Fraction((num * fr->denom + fr->num * denom) / gcd, 
                          (denom * fr->denom) / gcd);

      return temp;
   }

この場合、temp は「new」を使用した Fraction 型の動的オブジェクトへのポインタです (そうですか?)。クラス関数 'add' が呼び出された場所にこのポインターを返す場合、ローカル ポインター 'temp' を削除する必要がありますか? もしそうなら、どうすればこれを達成できますか?

編集:このクラスメンバーで new を使用するという私の(間違った)解釈は、 Fraction オブジェクトが Fractions へのポインターを介してインスタンス化されているためです(そのように):

    int main() {
      menu()
      return 0;
    }

    void menu() {
      Fraction* fr1 = 0;
      Fraction* fr2 = 0;
      Fraction* fr3 = 0;
      // ... user chooses to initialize, so fr1, fr2, fr3 no longer null

      // ... user chooses to add. call submenu, pass fr1, fr2, fr3 by POINTERS?
      addMenu(fr1, fr2, &fr3);
    }

見栄えが悪い... addMenu のヘッダーは次のとおりです。

     void addMenu(const FractionTeddyD*, const FractionTeddyD*, FractionTeddyD**);

編集 #2:「new」を使用せずに解決しました。T

4

5 に答える 5

0

メモリを使用しなくなったらすぐにメモリを削除する必要があります。コンパイラに組み込みのメモリ クリア システムがあり、それを *.exe ファイルに埋め込んでいない限り、メモリは解放されません。

add余談ですが、おそらく関数に新しいメモリを割り当てたくないでしょう。演算子のオーバーロードについて読んでみてください。operator +この用語を調べると、通常はクラスのインスタンスへの参照を返すことに気付くでしょう。そして、それがおそらくあなたの問題のより良い解決策になると思います。

ポインターが本当に必要で、いつ削除するかを考えたくない場合は、次のようなスマート ポインターstd::shared_ptrを格納するクラスが多数あります(参照) 。

于 2013-11-11T18:27:12.483 に答える
0

おそらく小さなクラス分数の設計は、おそらく良くありません。

持つ:

class Fraction {
    public:
    int numerator;
    int denominator;
};

参照渡しして値で返すことができます:

Fraction Fraction::add(const Fraction& fr) const;
于 2013-11-11T18:35:58.023 に答える