C++ 试图读取填充有对象的向量时发生访问冲突

C++ 试图读取填充有对象的向量时发生访问冲突,c++,vector,clone,copy-constructor,C++,Vector,Clone,Copy Constructor,编辑:我做了一些更改,并根据 Kyle和Dieter的评论,所以我修复了我的Clone()函数和 添加了一个赋值运算符以满足三的规则。而这 修复肯定是急需的,但同样的错误仍然存在。也许是我的 赋值运算符错了吗 我正在为一个更大的项目使用我在网上找到的jsonplus库。 我需要在向量中保存CJSONARAY类的对象。 CJsonArray没有复制构造函数,但有一个指针属性,所以我尝试自己制作一个(第一次制作复制构造函数时,我对c++还不熟悉) 以下是CJSONARAY的相关部分: cj射线

编辑:我做了一些更改,并根据 Kyle和Dieter的评论,所以我修复了我的Clone()函数和 添加了一个赋值运算符以满足三的规则。而这 修复肯定是急需的,但同样的错误仍然存在。也许是我的 赋值运算符错了吗

我正在为一个更大的项目使用我在网上找到的jsonplus库。 我需要在向量中保存CJSONARAY类的对象。 CJsonArray没有复制构造函数,但有一个指针属性,所以我尝试自己制作一个(第一次制作复制构造函数时,我对c++还不熟悉)

以下是CJSONARAY的相关部分:

cj射线

    class CJsonArray : public CJsonValue
    {
    private:
      std::vector <CJsonValue*> members;
    public:
        LIB_PRE CJsonArray();
        LIB_PRE CJsonArray(const CJsonArray * value);
        LIB_PRE CJsonArray(const CJsonArray &); //the added copy constructor
        LIB_PRE CJsonArray& operator=(const CJsonArray&);
        LIB_PRE ~CJsonArray();
cjsonvalue.cpp

    CJsonValue * CJsonValue::Clone(){
    return NULL;
}
派生类cjsonvaluenumber.h的示例

    class CJsonValueNumber : public CJsonValue
{
private:
  int value;
public:
  LIB_PRE CJsonValueNumber(int value);
  LIB_PRE CJsonValueNumber(const CJsonValueNumber * value);
  LIB_PRE CJsonValue * Clone();
  LIB_PRE jstring ToString() const;
  LIB_PRE void GetValue(int & number) const;
};
cjsonvaluenumber.cpp

CJsonValue * CJsonValueNumber::Clone(){
    return new CJsonValueNumber(*this);
}
生成错误的main.cpp:

 CJsonArray array1;
 CJsonArray array2;
 CJsonArray array3;
 CJsonArray array4;
 CJsonArray array5;

 array1.AddMember("test1");
 array2.AddMember("test1");
 array3.AddMember("test1");
 array4.AddMember("test1");
 array5.AddMember("test1");

 arrays.push_back(array1);
 arrays.push_back(array2);
 arrays.push_back(array3);
 arrays.push_back(array4);
 arrays.push_back(array5);

 std::string str = arrays[0].ToString();
错误:

Message.exe中0x026574BD处未处理的异常:0xC0000005:Access 读取位置0x00000000时发生冲突

调试信息: 在第一次推回时,第一个条目的成员已损坏。 在我实现复制构造函数之前,程序已经在第二次或第三次推送时崩溃了,我猜是因为vectore必须重新定位他的条目,但找不到它们?我很难过,第一次我不得不处理这个问题

所以我的问题是:我是否做了错误的复制构造函数?还是我完全走错了路,这与我无关

我看了很多其他的Stackoverflow问题来处理类似的问题,并试图遵循那里的建议,但我想我在这一过程中做了一些错误的事情

如果我需要提供更多信息,请告诉我

提前感谢您的帮助

CJsonValue::Clone()
方法需要是虚拟的。如果
CJsonArray
对象存储了
CJsonValue
对象的集合(与
CJsonValueNumber
或其他对象相反),则编译器无法知道
CJsonValueNumber
想要覆盖
Clone()
方法(如果它不是虚拟的)

这将导致总是调用
CJsonValue::Clone()
,而不是
CJsonValueNumber::Clone()
。此时,数组中有空引用,这可能会导致在
0x00000000
处发生访问冲突(
NULL
定义为
0
,或
0x00000000

因为
CJsonValue
无论如何都是一个抽象类(
CJsonValue::ToString()
方法是虚拟的void),所以我也会使
CJsonValue::Clone()
虚拟的void。这将保证克隆方法必须通过继承类来实现

总之,将您的
CJsonValue::Clone()
声明更改为:

LIB_PRE virtual CJsonValue * Clone() = 0;

可能:三(5)条规则-缺少作业操作员哇,谢谢你的快速回答!我会调查的。同时,您能否告诉我,我是否正确地实现了cjsonvalue.cpp中的clone()函数?我不确定是否只返回空值。你知道
Clone
不是虚拟的,对吗?我添加了赋值运算符(我希望我做得对),但问题仍然存在。我在OP中编辑代码以反映我的更改。出于好奇,
CJsonValueNumber(const CJsonValueNumber*value)的用途是什么应该提供服务吗?它肯定不会被
return new CJsonValueNumber(*this)调用
和您的
JsonArray
将在您添加的赋值运算符上调用未定义的行为,除非右值与
this->members
的大小完全匹配。既然你遇到了这么多麻烦,为什么不结束这篇文章并发布一篇真实的文章,以便花更少的时间去思考什么没有显示,花更多的时间在什么上?谢谢,我更改了它,我相信这也会是一个问题,但我仍然在执行主函数时遇到同样的错误
 CJsonArray array1;
 CJsonArray array2;
 CJsonArray array3;
 CJsonArray array4;
 CJsonArray array5;

 array1.AddMember("test1");
 array2.AddMember("test1");
 array3.AddMember("test1");
 array4.AddMember("test1");
 array5.AddMember("test1");

 arrays.push_back(array1);
 arrays.push_back(array2);
 arrays.push_back(array3);
 arrays.push_back(array4);
 arrays.push_back(array5);

 std::string str = arrays[0].ToString();
LIB_PRE virtual CJsonValue * Clone() = 0;