简体   繁体   English

指针未释放-指针问题?

[英]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. 您的maingetAdditiveTerms函数的代码对于指针感到笨拙。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM