1

我最近开始使用 C++,但我并不完全确定我掌握了指针的概念以及它们与数组的连接。我有两个类,术语和多项式。我有一个主循环,允许用户输入 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”类中,我使用“Term”指针来存储添加到“Polynom”对象的所有“Term”对象。“Polynom”类中的“Term”指针在“Polynom”构造函数中初始化一次。

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

我知道我可以使用向量而不是指针来存储“术语”对象,但我正在尝试了解指针的工作原理。我也不确定何时应该删除在主循环中创建的对象。因为每次执行循环时,我都会创建一个新的“Term”对象,但我从不删除它们。

编辑:我曾经以这种方式在“Polynom”类中分配“Term”对象:term = new Term[]; 然后我将其更改为 term = new Term[10]; 但是当我执行 term[antal_termer] = *t; 时我仍然崩溃

4

2 回答 2

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

这会崩溃,因为您可能没有分配足够的内存。您最好的选择是使用 astd::vector而不是动态数组。

是分配期限term = new Term;还是term = new Term[sz];

如果是第一个,则只能存储一个对象,并 term+antal_termer超出此范围。如果是第二个,如果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

从评论中粘贴结果。

antal_termer未在构造函数中初始化,导致此处的内存访问无效:

*(term+antal_termer) = *t;

由于代码正在复制t,通过赋值,您可以delete potens;在调用addTerm(). 代码必须防止超出term数组的末尾addTerm(),否则会发生另一个无效的内存访问:

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 回答