****很抱歉原帖中有关numCars的混淆。我修改了代码以与原始的******
一致以下学术课程是原始问题的简化版本,但它侧重于我尚未解决的问题。这个问题有2个类和一个主要方法,2个类由Dealer类和Car类组成。 Dealer类有一个私有Car *指针,它在Dealer的构造函数中初始化为动态数组。调用Dealer的addCar方法时,main方法中会发生错误。 在main方法中,我故意将Dealer变量传递给addCar(Dealer& d)方法,以模仿原始应用程序的结构。然后,addCar方法调用Dealer的addCar(const Car& car)方法,当我执行cars [numCars ++] = car时,会发生访问冲突;你能解释为什么汽车[numCars ++] =汽车导致访问违规
/**********************************Dealer.h**************************/
#include <cstdlib>
#include "Car.h"
using namespace std;
class Dealer
{
public:
Dealer(int maxCars = DEFAULT_MAX_CARS)
:numCars(0) {cars = new Car [maxCars];}
~Dealer(){delete [] cars;}
int getTotalCars() const { return numCars;}
void addCar(const Car& car)
{
cars[numCars++] = car; // Access Violation
}
Car* begin(){return cars;};
Car* end(){ return cars + numCars;}
setNumCars(int count){numCars = count;}
private:
static const int DEFAULT_MAX_CARS = 10;
Car* cars;
int numCars;
};
/**********************************Car.h**********************/
#include <cstdlib>
#include <string>
using namespace std;
class Car{
public:
Car()
: year(0), make(""), model("")
{}
Car(int year, string make, string model)
: year(year), make(make), model(model)
{}
string getMake() const {return make;}
void setMake(string make){this->make=make;}
string getModel() const {return model;}
void setModel(string model){this->model=model;}
int getYear() const {return year;}
void setYear(int year){this->year=year;}
private:
int year;
string make;
string model;
};
ostream& operator<< (ostream& out, const Car& car)
{
out << car.getYear() << " " << car.getMake() << " " << car.getModel();
return out;
}
/**********************************Main.cpp**********************/
#include <cstdlib>
#include <iostream>
#include "Dealer.h"
using namespace std;
void addCar(Dealer& d);
int main(int argc, char *argv[])
{
Dealer d;
addCar(d);
system("PAUSE");
return EXIT_SUCCESS;
}
void addCar(Dealer& d)
{
d = Dealer();
d.addCar(Car(2007, "Honda", "Civic"));
cout << d.getTotalCars() << " total cars" << endl;
}
答案 0 :(得分:4)
void addCar(const Car& car)
{
cars[numCars++] = car; // Access Violation
}
你永远不会初始化numCars - 它包含堆中的一些值,几乎肯定是非零的。这会导致您超出汽车数组的末尾并进入无法访问的内存。您应该在构造函数中将numCars设置为0.
除此之外,你应该在addCar中进行一些检查,这样你就不会超出汽车数组。
编辑:
代码还有一些其他问题 - 例如,“d =经销商();”创建一个新的经销商,并通过引用addCars覆盖你传递的那个,这似乎不是你想要做的。
尝试向构造函数/析构函数添加一些额外的跟踪,以验证您认为实际调用的构造函数是 - 看起来Dealer()应该使用您指定的默认参数调用构造函数,但如果不是,则默认构造函数。
答案 1 :(得分:1)
您没有在任何地方初始化numCars
,您应该将其设置为0:
Dealer(int maxCars = DEFAULT_MAX_CARS) :
numCars(0)
{
cars = new Car[maxCars];
}
你必须使用原始指针吗?为什么不把它包起来改为使用std::vector
?
答案 2 :(得分:1)
上述代码中没有任何内容初始化Dealer :: numCars。因此它可以是任何随机垃圾。
答案 3 :(得分:1)
也许我没有看到它,但你最初在哪里设置numCars?
答案 4 :(得分:0)
这对我来说就像内存泄漏,因为你没有释放 cars 指针所持有的先前内存:
setNumCars(0) {cars = new Car[maxCars];}
并且这段代码应该真的应该防止溢出条件:
void addCar(const Car& car)
{
cars[numCars++] = car; // Access Violation '
}
做这样的事情:
void addCar(const Car& car)
{
if (numCars < maxCars)
cars[numCars++] = car; '
else
// throw and exception .....
// or better still grow the cars buffer
}
答案 5 :(得分:0)
cars[numCars++] = car; // Access Violation
我发现代码中没有任何问题。可能是其他地方的问题?
您可以尝试以下方式:
将数组更改为vector并尝试使用at()来捕获out_of_range异常。 类似的东西:
std::vector<int> myVec;
try
{
int x = myVec.at(0);
}
catch(std::out_of_range& oor)
{
printf("\nout of range ");
}