1

私は最近C++を使い始めましたが、ポインターの概念とそれらの配列への接続を完全に理解しているとは言えません。TermとPolynomの2つのクラスがあります。ユーザーが2つの数字を入力できるメインループがあります。次に、これらの番号が「Term」オブジェクトに追加され、そのオブジェクトが「Polynom」オブジェクトに追加されます。ループが実行されるたびに、新しい「Term」オブジェクトが作成されます。

 //These lines are executed until the user is done entering numbers             
 potens = new Term;
 potens->sattPotens(kinput, ninput);//Add values to "Term object"
 poly.addTerm(potens);//Add "Term" object to "Polynom" object

「Polynom」オブジェクトは、プログラムで1回だけ作成されます。「Polynom」クラスでは、「Term」ポインタを使用して、「Polynom」オブジェクトに追加されたすべての「Term」オブジェクトを格納します。「Polynom」クラスの「Term」ポインタは、「Polynom」コンストラクタで1回開始されます。

 void Polynom::addTerm(Term *t){
      *(term+antal_termer) = *t;//This is were the program crashes
      antal_termer++;
}

ポインタの代わりにベクトルを使用して「Term」オブジェクトを格納できることは知っていますが、ポインタがどのように機能するかを学習しようとしています。また、メインループで作成されたオブジェクトをいつ削除するのかわかりません。ループが実行されるたびに、新しい「Term」オブジェクトを作成しますが、削除することはありません。

編集:私は「Polynom」クラスの「Term」オブジェクトを次のように割り当てていました。term= new Term []; 次に、それをterm = newTerm[10]に変更しました。しかし、term [antal_termer] = * t;を実行すると、まだクラッシュします。

4

2 に答える 2

1
 *(term+antal_termer) = *t;//This is were the program crashes
 antal_termer++;

おそらく十分なメモリが割り当てられていないため、これはクラッシュします。std::vector動的配列の代わりに aを使用することをお勧めします。

期間は割り当てられていますterm = new Term;term = new Term[sz];?

最初の場合は、1 つのオブジェクトしか格納できず、 term+antal_termerそれ以上になります。2 番目の場合、次の場合に問題が発生しますantal_termer >= sz

このstd::vectorオプションにより、自動管理が可能になります。

 std::vector<Term> terms;
 Term potens; //why use new?
 terms.push_back(potens);

ポインターではなく、オブジェクトを使用していることに注意してください。ポインターの場合、それは

 std::vector<Term*> terms;
 Term* potens = new Term;
 terms.push_back(potens);

ただし、使い終わったらメモリを削除する必要があることに注意してください。

于 2012-05-18T10:01:17.913 に答える
0

Pasting in outcome from comments.

antal_termer was not initialised in the constructor, resulting in invalid memory access here:

*(term+antal_termer) = *t;

As the code is copying t, via assignment, you can delete potens; after the call to addTerm(). The code must prevent going beyond the end of the term array in addTerm(), otherwise another invalid memory access will occur:

void Polynom::addTerm(Term *t){
      if (antal_termer < 10)  // Use constant instead of literal 10
      {
          *(term+antal_termer) = *t;
          antal_termer++;
      }
}
于 2012-05-18T10:19:48.187 に答える