【问题标题】:C++: std::copy fails with access violation reading location errorC++:std::copy 因访问冲突读取位置错误而失败
【发布时间】:2015-12-20 15:26:23
【问题描述】:

我正在尝试从我使用 std::copy C++ 函数创建的类中复制对象列表,但该函数崩溃并出现下一条错误消息:

在 0x00007FFA91BAC570 (msvcr120.dll) 处未处理的异常 MyProject.exe:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF.

这个类非常简单,我不知道是什么导致复制函数因此类错误而崩溃。 该类如下所示:

class XMLObjects
    {
    private:
        int id;
        string name;
        int leftUpCornerX;
        int leftUpCornerY;
        int rightDownCornerX;
        int rightDownCornerY;
        bool isFound; //it's true if this object was found in the OR file and in the GT file

public:
    XMLObjects(){}
    XMLObjects(int _id){ id = _id; }
    XMLObjects(int _id, string _name, int _leftUpCornerX, int _leftUpCornerY, int _rightDownCornerX, int _rightDownCornerY) { id = _id; name = _name; leftUpCornerX = _leftUpCornerX; leftUpCornerY = _leftUpCornerY; rightDownCornerX = _rightDownCornerX; rightDownCornerY = _rightDownCornerY; isFound = false; }
    ~XMLObjects(){}

    void setID(int _id){ id = _id; }
    void setName( string _name){ name=_name; }
    void setLeftUpCorner(int _leftUpCornerX, int _leftUpCornerY){ leftUpCornerX = _leftUpCornerX; leftUpCornerY = _leftUpCornerY; }
    void setRightDownCorner(int _rightDownCornerX, int _rightDownCornerY){ rightDownCornerX = _rightDownCornerX; rightDownCornerY = _rightDownCornerY; }
    void objectWasFound(){ isFound = true; }

    int getID(){ return id; }
    string getName(){ return name; }
    int getLeftUpCornerX(){ return leftUpCornerX; }
    int getLeftUpCornerY(){ return leftUpCornerY; }
    int getRightDownCornerX(){ return rightDownCornerX; }
    int getRightDownCornerY(){ return rightDownCornerY; }
    bool isObjectFound(){ return isFound; }
};

复制函数的调用如下:

list<XMLObjects> objects;
objects.push_front(obj1);
objects.push_front(obj2);
objects.push_front(obj3);
list<XMLObjects> NewObjectsList;
std::copy(objects.begin(), objects.end(), NewObjectsList.begin());

谁能帮忙?

【问题讨论】:

  • 你必须使用inserter
  • 为了扩展它,NewObjectsList 是空的,std::copy 不会调整它的大小。
  • 为什么不只是list&lt;XMLObjects&gt; NewObjectsList = objects
  • 我还建议以下几点:(1)XMLObjects 构造函数应该至少初始化所有ints 和bools。并且 (2) 第三个 XMLObjects 构造函数应该将给定的 _name 移动到成员 name 中。

标签: c++ list copy


【解决方案1】:

std::copy 不会调整输出大小,因此您必须先调整容器大小或使用插入元素的特殊迭代器。

您可以使用以下代码。

std::copy(objects.begin(), objects.end(),
          std::inserter(NewObjectsList, NewObjectsList.end()));

如评论中所述,在您的情况下,您可以直接复制:

list<XMLObjects> NewObjectsList = objects;

【讨论】:

  • 或者干脆std::back_inserter(NewObjectsList)
猜你喜欢
  • 1970-01-01
  • 2013-08-12
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多