Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 0xC0000005:访问冲突读取位置0xCCD0。C++;_C++_Access Violation - Fatal编程技术网

C++ 0xC0000005:访问冲突读取位置0xCCD0。C++;

C++ 0xC0000005:访问冲突读取位置0xCCD0。C++;,c++,access-violation,C++,Access Violation,当我试图将一个字符串(存储在类中)设置为另一个字符串时,出现了上述问题。我一直在努力寻找我是否没有初始化任何变量,但我找不到这样的情况。在debug mod中,我得到了上面的错误。在发布模式下,它挂起,Win7查找问题,没有主要的中止或重试窗口。这是相关的代码,我的主程序还有一个头文件,如果你觉得应该包括它,我会包括导致错误的那一行。语言是C++的明显的。 //Error occurs in this area: Car one; one = two; one.addExtra

当我试图将一个字符串(存储在类中)设置为另一个字符串时,出现了上述问题。我一直在努力寻找我是否没有初始化任何变量,但我找不到这样的情况。在debug mod中,我得到了上面的错误。在发布模式下,它挂起,Win7查找问题,没有主要的中止或重试窗口。这是相关的代码,我的主程序还有一个头文件,如果你觉得应该包括它,我会包括导致错误的那一行。语言是C++的明显的。
//Error occurs in this area:
   Car one;
   one = two;
   one.addExtra ("Windows");

   log << "Car one: " << one << endl;
   two = Car(one); // call copy constructor.
//I realize when I call the first one = two, there are no extras
//stored int Car one, which is what differs between the two. Remaining 
//code. Extras header:

#include <iostream>
#include <string>
#include <string.h>
using namespace std;

class Extras
{
public:
    friend class Car;
    friend int main();
    friend ostream& operator << (ostream& os, const Extras& in);
    friend class CarLot;
    Extras(const Extras& other);
    Extras& operator=(Extras  &rhs);
    Extras(string in);
    Extras();
    ~Extras();
    void modify_ext(string* in);
    //string ex_list;
private:
    int place;
    string *ex_list;
};
//Extras.cpp:
#include "Extras.h"

Extras::Extras(string in)
{
    delete ex_list;
    ex_list = new string;
    place = 0;
    //ex_list = new string[4];
    (*ex_list) = in;
    place++;
}

Extras::Extras()
{
    //ex_list = new string[4];
    place = 0;
    //for(int i = 0; i < 4; i++)
    ex_list = new string;
    *ex_list = "0";
}

//Overloaded << operator for Extras class to
//easily output array contents
ostream& operator<< (ostream& os, Extras const &in)
{
    os << *(in.ex_list);
    return os;
}

Extras& Extras::operator=(Extras &rhs)
{
    if(this != &rhs)
    {
        //string temp;
        //temp = rhs.ex_list;
        modify_ext(rhs.ex_list);
        cout << endl << endl << ex_list << endl << endl;
        place = rhs.place;
    }
    return *this;
}

Extras::Extras(const Extras& other) : place(other.place), ex_list(other.ex_list)
{
    //for(int i = 0; i < 4; i++)
        //ex_list = other.ex_list;
}

void Extras::modify_ext(string* in)
{
    delete ex_list;
    ex_list = new string;
    (*ex_list).resize((*in).size());
    for(unsigned int i = 0; i < (*in).size(); i++)
        ex_list[i] = in[i];
}

Extras::~Extras()
{
    delete ex_list;
    place = 0;
}

//Car Header:
#include "Extras.h"

class Car
{
public:
    friend class Extras;
    friend Extras& Extras::operator=(Extras &rhs);
    friend int main();
    friend ostream& operator<< (ostream& os, const Car& in);
    friend class CarLot;
    friend void add_extra();
    ~Car();
    Car();
    Car(Car& other);
    Car(string in_name, int in_year, string in_color, float in_cost);
    Car& operator=(Car const &rhs);
    void edit_extr(int in);
    void addExtra(string in);
private:
    string name, color;
    int year, extr_num;
    float cost;
    Extras  *extr;
};

//Car.cpp:


 #include "car.h"

//Constructor
Car::Car(string in_name, int in_year, string in_color, float in_cost)
{
    name = in_name;
    color = in_color;
    year = in_year;
    cost = in_cost;
    extr = new Extras[3];
    extr_num = 0;
}

//Overloaded = operator
Car& Car::operator=(Car const &rhs)
{
    if(this != &rhs)
    {
        name = rhs.name;
        color = rhs.color;
        year = rhs.year;
        cost = rhs.cost;
        //delete extr;
        extr = rhs.extr;
        extr_num = rhs.extr_num;
    }
    return *this;

}



//Default Constructor
Car::Car()
{
    name = "TEMP";
    color = "BLUE";
    year = 0;
    cost = 0;
    extr = new Extras[3];
    extr_num = 0;
}

//Destructor
Car::~Car()
{
    delete extr;
    extr = NULL;
}

//Copy constructor
Car::Car(Car& other) : name(other.name), color(other.color), year(other.year), 
    cost(other.cost), extr_num(other.extr_num)

{
    //delete extr;
    for(int i = 0; i < extr_num; i++)
    {
        extr[i].modify_ext(other.extr[i].ex_list);
        extr[i].place = other.extr[i].place;
    }
}





//Overloaded << operator for Car class 
ostream& operator<< (ostream& os, const Car& in)
{
    os.precision(2);
    os << in.name << ", " << in.year << ", " 
        << in.color << ", $"<< in.cost << ", ";
    os << "extras include: ";
    for(int k = 0; k < in.extr_num; k++)
    {
        os << in.extr[k] << ", ";
    }
    os << endl;
    return os;
}

void Car::edit_extr(int in)
{
    Extras* temp;
    temp = new Extras[in];
    for(int i = 0; i < in; i++)
        temp[i] = extr[i];
    extr_num = in;
    delete extr;
    extr = temp;
}

void Car::addExtra(string in)
{
    if(extr_num == 3)
    {
        //log << "Car has too many extras.";
        return;
    }
    //edit_extr(extr_num + 1);
    *(extr[extr_num].ex_list) = in;
    extr[extr_num].place++;
    extr_num++;
}
//此区域发生错误:
一号车厢;
一等于二;
一个附录(“窗口”);

在构造函数中记录您正在删除的
ex\u列表
。它甚至还没有被分配,所以这是错误的。在分配新字符串时,请删除该字符串并改为执行此操作:

ex_list = new string(in);
这样就可以使用字符串复制构造函数。你可以在构造器中摆脱你试图在下面做的任何事情,因为这将为你做

编辑:


实际上,这段代码中有很多问题。是否有任何理由希望字符串在内部成为指针?您在许多不同的地方没有正确使用指针。当我向下滚动时,我只注意到了第一个。

在您的构造函数中,您正在删除
ex\u列表。它甚至还没有被分配,所以这是错误的。在分配新字符串时,请删除该字符串并改为执行此操作:

ex_list = new string(in);
这样就可以使用字符串复制构造函数。你可以在构造器中摆脱你试图在下面做的任何事情,因为这将为你做

编辑:


实际上,这段代码中有很多问题。是否有任何理由希望字符串在内部成为指针?您在许多不同的地方没有正确使用指针。当我向下滚动时,我只注意到了第一个。VC++调试版本中的分配器使用了一些神奇的值来填充分配的区域。特别是,0xCC是已分配但现在已释放的内存。因此,地址0xCCD0看起来很像内存中释放的指针的一个小偏移量(例如,到结构或类成员)。鉴于此,Mark Loeser的答案看起来很有希望。

VC++调试版本中的分配器使用一些神奇的值来填充分配的区域。特别是,0xCC是已分配但现在已释放的内存。因此,地址0xCCD0看起来很像内存中释放的指针的一个小偏移量(例如,到结构或类成员)。考虑到这一点,马克·洛瑟的答案看起来很有希望。

我所看到的被打破的东西:


否,它使用复制构造函数创建一个临时对象,将其传递给
two
上的
operator=()
,然后销毁临时对象


应该是:

Extras& operator=(const Extras &rhs);

更好:

Extras::Extras(const string& in): place(1), ex_list(new string(in))
{
}



转到
汽车

friend class Extras;
friend Extras& Extras::operator=(Extras &rhs);
friend int main();
friend ostream& operator<< (ostream& os, const Car& in);
friend class CarLot;
friend void add_extra();
应该是:

Car(const Car& other);
Car(const string& in_name, int in_year, const string& in_color, float in_cost);
将对象传递给函数时,引用是您的朋友



我就到此为止。

我看到的是破碎的:


否,它使用复制构造函数创建一个临时对象,将其传递给
two
上的
operator=()
,然后销毁临时对象


应该是:

Extras& operator=(const Extras &rhs);

更好:

Extras::Extras(const string& in): place(1), ex_list(new string(in))
{
}



转到
汽车

friend class Extras;
friend Extras& Extras::operator=(Extras &rhs);
friend int main();
friend ostream& operator<< (ostream& os, const Car& in);
friend class CarLot;
friend void add_extra();
应该是:

Car(const Car& other);
Car(const string& in_name, int in_year, const string& in_color, float in_cost);
将对象传递给函数时,引用是您的朋友



我就到此为止。

您应该尽量减少重现问题所需的代码。至少试着在调试器下运行它。我认为这个问题不值得任何回答…Piotr,我两个都做了。我在我的OP中说我在debug中运行了它,这就是我得到错误的原因,这是问题的标题,我尝试单独测试每个函数,但没有得到结果。之后我开始重新添加内容。抱歉。您应该始终尽量减少重现问题所需的代码。至少试着在调试器下运行它。我认为这个问题不值得任何回答…Piotr,我两个都做了。我在我的OP中说我在debug中运行了它,这就是我得到错误的原因,这是问题的标题,我尝试单独测试每个函数,但没有得到结果。之后我开始重新添加内容。对不起。@Mike:+1,你有更多的耐心把问题列出来。当我看到超过4条后,我放弃了:)我应该解释一下,因为那个代码糟糕得让人难堪。我在复制构造函数中将一个字符串=设置为另一个字符串时遇到了问题,因此我刚开始更改const和引用,因为这是一个访问问题,您告诉我要更改的很多内容原本就在那里,并且已经恢复。我改变了所有这些,得到了同样的错误。还有其他想法吗?另外,在我修改了calls copy constructor之后,第一条说calls copy constructor的注释是我老师的;它位于modify_ext函数中,该函数是Extras的成员函数,Extras是包含ex_list(两个字符串指针)的类。好吧,冒着对堆造成不必要打击的风险,您可以尝试
{delete ex_list;ex_list=new string(*in);}
。或者您可以使用调试器在中的
*ex\u list=*之前设置断点并查看
ex_列表
中的
,以及它们指向的内容。冻结=>无限循环=>尝试复制某些内容,但从未达到“完成”条件=>损坏的输入=>
in==0
?感谢您的帮助。我对它进行了调试,并将它完美地设置为“Windows”。此“ex_”列表未定义。它不起作用。我将我的Extras文件复制到一个全新的项目中,它们都编译并运行得非常好,所以我加入并修改了一些内容,这样我就不会使用有问题的代码,并使用测试过的重载=操作符作为Extras,这应该是可行的。现在我得到了错误:“访问冲突写入locati
friend class Extras;
friend Extras& Extras::operator=(Extras &rhs);
friend int main();
friend ostream& operator<< (ostream& os, const Car& in);
friend class CarLot;
friend void add_extra();
Car(Car& other);
Car(string in_name, int in_year, string in_color, float in_cost);
Car(const Car& other);
Car(const string& in_name, int in_year, const string& in_color, float in_cost);