C ++中的指针和内存分配

时间:2012-05-18 09:59:36

标签: c++ pointers memory-management

我最近开始使用C ++,我并不完全确定我掌握了指针的概念及其与数组的连接。我有两个课程,Term和Polynom。我有一个主循环,允许用户输入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”对象仅在程序中创建一次。在“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”对象,但我正在尝试学习指针的工作方式。我也不确定何时删除主循环中创建的对象。因为每次循环执行时我都会创建一个新的“Term”对象,但我从不删除它们。

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

2 个答案:

答案 0 :(得分:1)

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

这会崩溃,因为您可能没有分配足够的内存。您最好的选择是使用std::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);

但请注意,完成后必须删除内存。

答案 1 :(得分:0)

粘贴评论结果。

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

*(term+antal_termer) = *t;

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

void Polynom::addTerm(Term *t){
      if (antal_termer < 10)  // Use constant instead of literal 10
      {
          *(term+antal_termer) = *t;
          antal_termer++;
      }
}