繁体   English   中英

C ++动态数组访问冲突

[英]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 &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中进行一些检查,以确保不会超出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM