C++ 动态数组访问冲突

标签 c++ access-violation dynamic-arrays

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

以下学术计划是原始问题的简化版本,但它侧重于我尚未解决的问题。这个问题有 2 个类和一个主要方法,这 2 个类由 Dealer 类和 Car 类组成。 Dealer 类有一个私有(private)的 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)

:汽车数量(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 &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 - 它包含堆中的一些值,该值几乎肯定是非零的。这会导致您读取超出 cars 数组末尾的内容并进入无法访问的内存。您应该在构造函数中将 numCars 设置为 0。

除此之外,您应该在 addCar 中进行一些检查,以免超出 cars 数组。

编辑:

代码还有一些其他问题 - 例如,“d = Dealer();”创建一个新经销商并覆盖您通过引用传递给 addCars 的经销商,这似乎不是您想要做的。

尝试向构造函数/析构函数添加一些额外的跟踪以验证您认为正在调用的构造函数实际上是 - 看起来 Dealer() 应该使用您指定的默认参数调用构造函数,但如果不是,它正在获取默认构造函数。

关于C++ 动态数组访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457669/

相关文章:

c++ - 不同线程中的 MPI_Barrier,行为?

c++ - 在 Visual Studio 2019 上使用 OpenCV 和 C++ 获取图片每列的颜色平均值

c - 写入初始化缓冲区时 swprintf_s 失败

c++ - 如何正确清理阵列? C++

c++ - 如何在 C++ 中保存动态数组中的值?

C 程序,指针参数不会保存值

c++ - 返回符合C++标准

c++ - 'delete' 函数之前的预期 Unqualified-Id

delphi - 如何在 Delphi 中找到导致 AV 的悬空接口(interface)

c++ - 字符串太长时出现 AccessViolationException (C++)