**** 对于原帖中关于 numCars 的混淆,我们深表歉意。我修改了代码,与原来一致*****

以下学术计划是原始问题的简化版本,但它重点关注我尚未解决的问题。该问题有 2 个类和一个 main 方法,这 2 个类由 Dealer 类和 Car 类组成。Dealer 类有一个私有 Car* 指针,该指针在 Dealer 的构造函数中初始化为动态数组。当调用 Dealer 的 addCar 方法时,main 方法中出现该错误。在 main 方法中,我有意将 Dealer 变量传递给 addCar(Dealer& d) 方法以模仿原始应用程序的结构。然后,addCar 方法调用 Dealer 的 addCar(const Car& car) 方法,当我执行 cars[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) {cars = 新车[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 &lt;cstdlib&gt;
#include &lt;iostream&gt;
#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检查,这样你就不会超支车阵。

编辑:

有与代码中的一些其他问题 - 例如,“d =经销商();”创建一个新的经销商,并覆盖您通过引用传递到似乎没有你想要做什么addCars之一。

尝试添加一些额外的跟踪到构造函数/析构函数,以验证您认为正在被实际调用构造函数是 - 看来,经销商()应该与你指定一个默认的参数来调用构造函数,但如果没有它越来越默认构造。

其他提示

您不是在初始化numCars的任何地方,你应该把它设置为0:

Dealer(int maxCars = DEFAULT_MAX_CARS) :
numCars(0)
{
    cars = new Car[maxCars];
}

你有使用原始指针?为什么不把它包起来,用std::vector呢?

在上面的代码中没有什么初始化经销商:: 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

从发布的代码中我没有看到任何问题。可能问题出在其他地方?

也许你可以尝试以下操作:

  • 将数组更改为向量并尝试使用 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归因
不隶属于 StackOverflow
scroll top