[英]Pointer Being Freed Was Not Allocated - Pointer Issue?
Method: 方法:
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;
}
When I create a an object and try to access this method, I get the following error: 当我创建一个对象并尝试访问此方法时,出现以下错误:
ExpressionCalculator(19982,0x7fff8b43e380) malloc: * error for object 0x7ffedfe729a8: pointer being freed was not allocated * set a breakpoint in malloc_error_break to debug ExpressionCalculator(19982,0x7fff8b43e380)malloc: *对象0x7ffedfe729a8的错误:未分配释放的指针*在malloc_error_break中设置一个断点以进行调试
Main where object is being created: 创建对象的主要位置:
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;
}
Now, I realize the way I'm getting these pointers into the constructor looks a little odd, I had to make pointers in order to test it in the fashion that the parameters will be passed throughout the program. 现在,我意识到将这些指针放入构造函数的方式看起来有些奇怪,我必须制作指针以通过在整个程序中传递参数的方式对其进行测试。 Any ideas why I'm getting this error? 有任何想法为什么我会收到此错误吗? I'm sure it has to do with an ill-defined pointer. 我确定它与定义不正确的指针有关。 Thanks! 谢谢!
The error you get is pretty clear, you're trying to delete a pointer that references an object for which you didn't allocate memory (tipically using the new
operator). 得到的错误非常清楚,您正在尝试删除一个指针,该指针引用了一个您没有分配内存的对象(通常使用new
运算符)。
The code of your main
and getAdditiveTerms
functions feels clumsy regarding pointers. 您的main
和getAdditiveTerms
函数的代码对于指针感到笨拙。 You are mixing pointer and non-pointer variables. 您正在混合指针变量和非指针变量。 If you need pointers in your Addition
constructor, why don't you pass directly a pointer: 如果您在Addition
构造函数中需要指针,为什么不直接传递指针:
Integer* integer1 = new Integer("1");
Integer* integer2 = new Integer("-2");
Addition add1(integer1, integer2);
Then, you can delete the Integer
pointers either in the Addition
desctructor (which seems to be the best choice here) or whenever you don't need them anymore. 然后,您可以在Addition
描述符中删除Integer
指针(这似乎是此处的最佳选择),也可以在不再需要它们时删除它们。
Regarding getAdditiveTerms
, why are you deleting objects here? 关于getAdditiveTerms
,为什么要在这里删除对象? It feels strange to delete pointers in such getter method. 在这种getter方法中删除指针感觉很奇怪。 I think you can remove those delete statements. 我认为您可以删除那些删除语句。
To sum up: 总结一下:
// 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;
}
Edit using Addition destructor 使用添加析构函数进行编辑
If you aim to use the Addition
destructor: 如果您打算使用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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.