当前位置:  开发笔记 > 编程语言 > 正文

矢量迭代器不是dereferencable

如何解决《矢量迭代器不是dereferencable》经验,为你挑选了2个好方法。

我有一个名为Shape的抽象基类,从中派生出Circle和Rectangle,但是当我在VS 2005中执行以下代码时,我得到错误Debug assertion failed.同时我没有在任何类中重载==运算符

表达式:向量迭代器不可解除引用,这是什么原因.

  vector s1;
  s1.push_back(new Circle(point(1,2),3));
  s1.push_back(new Circle(point(4,3),5));
  s1.push_back(new Rectangle(point(1,1),4,5));

  vector s2(s1);
  reverse(s1.begin(),s1.end());

  (*find(s1.begin(),s1.end(),new Circle(point(1,2),3)))->move(point(10,20));

David Pierre.. 12

简单:

查找失败,因为在比较Shape*的向量中找不到新创建的Circle

失败的查找返回结束迭代器,它不是由调试断言捕获的可引用的

为了让它像你想要的那样工作,你需要比较Shape,而不是Shape*

正如其他答案所指出的,boost :: ptr_vector是实现这一目标的简单方法.



1> David Pierre..:

简单:

查找失败,因为在比较Shape*的向量中找不到新创建的Circle

失败的查找返回结束迭代器,它不是由调试断言捕获的可引用的

为了让它像你想要的那样工作,你需要比较Shape,而不是Shape*

正如其他答案所指出的,boost :: ptr_vector是实现这一目标的简单方法.



2> xtofl..:

就像@David Pierre建议的那样:find是基于值的:它在一个指针的迭代器范围内查找(例如0x0F234420),它等于new Circle(point(1,2),3)你刚才创建的指针.由于这是一个新对象,它不会存在.

您可以通过使用find_if比较指针引用的对象的运算符来解决这个问题.

但是,Criterium应该能够区分形状类型.

class Shape {
public:
    //amongst other functions
    virtual bool equal( const Shape* ) const = 0;
};

class Circle : public Shape {
public:
    bool equal( const Shape* pOther ) const {
        const Circle* pOtherCircle = dynamic_cast( pOther );
        if( pOtherCircle == NULL ) return false;
        // compare circle members
    }
};

class Rectangle : public Shape {
public:
    bool equal( const Shape* pOther ) const {
        const Rectangle* pOtherR = dynamic_cast( pOther );
        if( pOtherR == NULL ) return false;
        // compare rectangle members
    }
};



Shape* pFindThis = new Circle(point(1,2),3);
vector::const_iterator itFound = find_if(s1.begin(),s1.end(), 
    bind1st( mem_fun( &Shape::equal ), pFindThis) ) );
delete pFindThis; //leak resolved by Mark Ransom - tx!

if( itFound != s1.end() ) {
    (*itFound)->move(point(10,20));
}

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有