gpt4 book ai didi

c++ - 指针未释放-指针问题?

转载 作者:行者123 更新时间:2023-12-03 08:47:46 25 4
gpt4 key购买 nike

方法:

vector <Expression*> Addition :: getAdditiveTerms() {
vector <Expression*> terms;
if((obj1->getType() == "Addition" || obj1->getType() == "Subtraction") && (obj2->getType() == "Addition" || obj2->getType() == "Subtraction")) {
if(obj1->getLeftSide()->getType() == "Integer") {
Expression* LL = obj1->getLeftSide();
terms.push_back(LL);
delete obj1->getLeftSide();
}
if(obj1->getRightSide()->getType() == "Integer") {
Expression* LR = obj1->getRightSide();
terms.push_back(LR);
delete obj1->getRightSide();
}
if(obj2->getLeftSide()->getType() == "Integer") {
Expression* RL = obj2->getLeftSide();
terms.push_back(RL);
delete obj2->getLeftSide();
}
if(obj2->getRightSide()->getType() == "Integer") {
Expression* RR = obj2->getRightSide();
terms.push_back(RR);
delete obj2->getRightSide();
}
}
return terms;
}

当我创建一个对象并尝试访问此方法时,出现以下错误:

ExpressionCalculator(19982,0x7fff8b43e380) malloc: * error for object 0x7ffedfe729a8: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug



创建对象的主要位置:
int main() {
Integer integ1("1");
Integer integ2("-2");
Integer* integer1 = &integ1;
Integer* integer2 = &integ2;
Addition add1(integer1, integer2);
Integer integ3("6");
Integer integ4("-9");
Integer* integer3 = &integ3;
Integer* integer4 = &integ4;
Addition add2(integer3, integer4);
Addition* addit1 = &add1;
Addition* addit2 = &add2;

Addition add3(addit1, addit2);

vector <Expression*> addTerms = add3.getAdditiveTerms();

for(int i = 0; i < addTerms.size(); i++)
cout << addTerms[i]->getValue() << endl;

}

现在,我意识到将这些指针放入构造函数的方式看起来有些奇怪,我必须制作指针以通过在整个程序中传递参数的方式对其进行测试。有任何想法为什么我会收到此错误吗?我确定这与定义不正确的指针有关。谢谢!

最佳答案

得到的错误非常清楚,您正在尝试删除一个指针,该指针引用了未分配内存的对象(通常使用new运算符)。
maingetAdditiveTerms函数的代码对于指针感到笨拙。您正在混合指针变量和非指针变量。如果在Addition构造函数中需要指针,为什么不直接传递指针:

Integer* integer1 = new Integer("1");
Integer* integer2 = new Integer("-2");
Addition add1(integer1, integer2);

然后,您可以在 Integer解码器中删除 Addition指针(这似乎是此处的最佳选择),也可以在不再需要它们时删除它们。

关于 getAdditiveTerms,为什么在这里删除对象?在这种getter方法中删除指针感觉很奇怪。我认为您可以删除那些删除语句。

总结一下:
// Remove delete statements
vector <Expression*> Addition :: getAdditiveTerms() {
vector <Expression*> terms;
if((obj1->getType() == "Addition" || obj1->getType() == "Subtraction") && (obj2->getType() == "Addition" || obj2->getType() == "Subtraction")) {
if(obj1->getLeftSide()->getType() == "Integer") {
Expression* LL = obj1->getLeftSide();
terms.push_back(LL);
}
if(obj1->getRightSide()->getType() == "Integer") {
Expression* LR = obj1->getRightSide();
terms.push_back(LR);
}
if(obj2->getLeftSide()->getType() == "Integer") {
Expression* RL = obj2->getLeftSide();
terms.push_back(RL);
}
if(obj2->getRightSide()->getType() == "Integer") {
Expression* RR = obj2->getRightSide();
terms.push_back(RR);
}
}
return terms;
}

// Use pointers
int main() {
Integer* integer1 = new Integer("1");
Integer* integer2 = new Integer("-2");
Addition* add1 = new Addition(integer1, integer2);
Integer* integer3 = new Integer("6");
Integer* integer4 = new Integer("-9");
Addition* add2 = new Addition(integer3, integer4);
Addition* add3 = new Addition(addit1, addit2);

vector <Expression*> addTerms = add3->getAdditiveTerms();

for(int i = 0; i < addTerms.size(); i++)
cout << addTerms[i]->getValue() << endl;

delete add3;
delete add2;
delete add1;
delete integer4;
delete integer3;
delete integer2;
delete integer1;
}

使用添加析构函数进行编辑

如果您打算使用 Addition析构函数:
// In the Addition class, you need this
Addition::~Addition() {
delete m_leftSide; // Customize with the proper attribute
delete m_rightSide; // Customize with the proper attribute
}

// You don't need to delete all your pointers in the main now
int main() {
Integer* integer1 = new Integer("1");
Integer* integer2 = new Integer("-2");
Addition* add1 = new Addition(integer1, integer2);
Integer* integer3 = new Integer("6");
Integer* integer4 = new Integer("-9");
Addition* add2 = new Addition(integer3, integer4);
Addition* add3 = new Addition(addit1, addit2);

vector <Expression*> addTerms = add3->getAdditiveTerms();

for(int i = 0; i < addTerms.size(); i++)
cout << addTerms[i]->getValue() << endl;

delete add3; // Will recusively delete all the pointers
}

关于c++ - 指针未释放-指针问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49934151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com