如何解决“读取访问冲突”错误?

时间:2019-08-26 11:28:57

标签: c++ polymorphism composite

我设置了一个大小为2的“父类指针”向量来存储其“派生类”地址,但是无论我添加多少地址,该向量似乎都只存储最终地址,因此导致“访问冲突读取”问题。 顺便说一下,我使用了复合模式。

我尝试了很多方法,我使用了向量,2d指针(例如int **)。

class Node{
    public:
        virtual double evaluate();
};
class NumNode: public Node{
   private:
        double number;
    public:
        double evaluate();
        NumNode(int);
};
class OpNode: public Node{
    private:
        char operation;
        vector<Node*> branch;
    public:
        double evaluate();
        void addLeft(NumNode);
        void addRight(NumNode);
        OpNode(char);
};

double OpNode::evaluate(){
    if(this->operation == '+')
        return this->branch[0]->evaluate() + this->branch[1]- 
            >evaluate();**Exception thrown at 0x008C6097 in 
                          Project_Testing.exe: 0xC0000005: Access 
                          violation reading location 0xCCCCCCCC.**

return 0; 
}

void OpNode::addLeft(NumNode other){this->branch[0] = &other;}
void OpNode::addRight(NumNode other){this->branch[1] = &other;}

int main(){
    OpNode n('+');
    n.addLeft(NumNode(2));
    n.addRight(NumNode(3));
    cout << n.evaluate() << endl;
}

当您查看主要功能时,我添加了两个不同的NumNode。但是当我开始调试时。 branch[0] 0x006ff620 {...} Node * branch[1] 0x006ff620 {...} Node *. 他们有相同的地址!

2 个答案:

答案 0 :(得分:0)

您的问题在这里:

void OpNode::addLeft(NumNode other){this->branch[0] = &other;}
void OpNode::addRight(NumNode other){this->branch[1] = &other;}

如评论中所述:

  

您的addLeft和addRight采用堆栈参数的地址   其他。由于两个调用的堆栈看起来完全相同,因此您会看到   完全相同的地址。传递一个可以是   直接存储,或(在您的方法中)分配一个副本(包含新   NumNode(其他))并存储该地址。

解决该问题的另一种方法是使用std::shared_ptr 因此,您的常规列表变为:

vector<shared_ptr<Node> > branch;

然后:

void OpNode::addLeft(const shared_ptr<NumNode> >& other){this->branch[0] = other;}

答案 1 :(得分:0)

您正在将指针指向临时对象。 当此对象的生命周期结束引用是未定义行为时,在这种情况下将导致崩溃。

在堆上创建此对象以延长所需对象的寿命。

例如:

import Breads from './bread.js';

<FlatList 
 data={Breads}
 keyExtractor={(item, index) => item.id}
 renderItem={({item}) => <View>
                            <Image source={item.src} />
                            <Text>{item.title}</Text>
                         </View>
   }
/>