我最近开始使用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时,我仍然会崩溃;
答案 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()
进行复制。代码必须防止超出term
中addTerm()
数组的末尾,否则将发生另一个无效的内存访问:
void Polynom::addTerm(Term *t){
if (antal_termer < 10) // Use constant instead of literal 10
{
*(term+antal_termer) = *t;
antal_termer++;
}
}