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