[英]C++ Dynamic Array Access Violation
****很抱歉原帖中關於numCars的混淆。 我修改了代碼,使其與原始******一致
以下學術課程是原始問題的簡化版本,但重點是我尚未解決的問題。 這個問題有2個類和一個主要方法,這2個類包括Dealer類和Car類。 Dealer類具有私有的Car *指針,該指針已初始化為Dealer的構造函數中的動態數組。 調用Dealer的addCar方法時,在main方法中會發生錯誤。 在主要方法中,我有意將Dealer變量傳遞給addCar(Dealer&d)方法,以模仿原始應用程序的結構。 然后,addCar方法將調用Dealer的addCar(const Car&car)方法,在執行car [numCars ++] = car;時會發生訪問沖突。 您能解釋一下為什么cars [numCars ++] = car導致訪問沖突
/**********************************Dealer.h**************************/
#include <cstdlib>
#include "Car.h"
using namespace std;
class Dealer
{
public:
Dealer(int maxCars = DEFAULT_MAX_CARS)
:numCars(0){汽車=新車[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;
}
void addCar(const Car& car)
{
cars[numCars++] = car; // Access Violation
}
您永遠不會初始化numCars-它包含來自堆的一些值,該值幾乎肯定是非零的。 這使您無法讀取汽車陣列的末尾並進入無法訪問的內存。 您應該在構造函數中將numCars設置為0。
最重要的是,您應該在addCar中進行一些檢查,以確保不會超出cars數組。
編輯:
該代碼還有其他問題-例如,“ d = Dealer();”。 創建一個新的經銷商,並覆蓋您通過引用傳遞給addCars的經銷商,這似乎並不是您想要做的。
嘗試向構造函數/析構函數添加一些其他跟蹤,以驗證您認為實際上正在調用的構造函數是-似乎Dealer()應該使用您指定的默認參數來調用構造函數,但如果不是,則獲取默認構造函數。
您沒有在任何地方初始化numCars
,應該將其設置為0:
Dealer(int maxCars = DEFAULT_MAX_CARS) :
numCars(0)
{
cars = new Car[maxCars];
}
您是否必須使用原始指針? 為什么不把它包裝起來而使用std::vector
呢?
上面的代碼中沒有任何內容初始化Dealer :: numCars。 因此,它可以是任何隨機垃圾。
也許我沒有看到它,但是您最初在哪里設置numCars?
對我來說,這看起來像是內存泄漏 ,因為您不釋放汽車指針保留的先前的內存:
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
}
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 "); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.