gpt4 book ai didi

c++ - 0xC0000005 : Access violation reading location 0xccccccd0. C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:11 24 4
gpt4 key购买 nike

当我试图将一个字符串(存储在一个类中)设置为等于另一个字符串时,我遇到了上述问题。我梳理和梳理试图找到是否没有初始化任何变量,但我找不到这样的情况。在 Debug模式中,出现上述错误。在 Release模式下它挂起并且 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++;
}

正如我所说,我还有一个额外的头文件、另一个类和一个主程序(如果需要的话),但我认为这些代码已经足够了(抱歉!)任何人都可以浏览。任何帮助将不胜感激。

最佳答案

我看到的坏了:


two = Car(one); // call copy constructor.

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


Extras& operator=(Extras  &rhs);

应该是:

Extras& operator=(const Extras &rhs);

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

更好:

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

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;
}

查看您的默认构造函数,很明显 Extras 对象拥有 ex_list 中的字符串。但是,此复制构造函数声称拥有原始对象的 ex_list。它应该制作自己的拷贝:

Extras::Extras(const Extras& other): place(other.place), 
ex_list(new string(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];
}

您正在复制字符串。您只需要:

void Extras::modify_ext(const string* in)
{
*ex_list = *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(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);

在将对象传递给函数时,引用是您的 friend 。


我要到此为止了。

关于c++ - 0xC0000005 : Access violation reading location 0xccccccd0. C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com