访问数组中的第二个元素时,c++中的分段错误11

Segmentation Fault 11 in C++ when accessing second element in array

本文关键字:c++ 分段 错误 元素 数组 第二个 访问      更新时间:2023-10-16

简而言之,我有一个c++程序,它由一个Car类(包含子类SportsCar和SUV)以及一个存储Car对象的CarInventory组成。

我认为问题出在插入函数

void CarInventory::insert(Car *car) { 
    for (int i = 0; i < inventorySize; i++) {
        if (carArray[i]) { 
            i++;
        }

当你发现一辆车已经在你的carArray中,你增加i,但随后你在for循环中再次增加i。这样,您将跳过数组中的其他位置,并且它们将保持未初始化。

您分配了一个包含10辆汽车的数组。但是你只初始化了4辆车。

因此,当displayVehichles中的循环访问carArray[5]时,它可能会访问未初始化的内存。

这个语句看起来有点麻烦:

carArray = new Car *[maxStock];

应该是:

carArray = new Car *[maxStock];
for (int i = 0; i < maxStock; i++)
{
    carArray[i] = NULL;
}
totalNumCars = 0;

这样,你的插入方法将正确地工作。但是你的插入方法可以更简单:

void CarInventory::insert(Car *car) { 
    if (totalNumCars < maxStock)
        carArray[totalNumCars] = car;
        totalNumCars++;
    }
}

此外,在CarInventory超出作用域之前,您声明的汽车超出作用域的方式是可以的,它将引用已经被删除的Car对象。

使用std::vector来存放汽车:

class CarInventory
{
    std::vector<Car*> _cars;
 public:
    void displayVehicles()
    {
        for (auto i = _cars.begin(); i != _cars.end(); i++)
        {
            i->printInfo();
        }
    }
    void insert(Car* car)
    {
        _cars.push_back(car);
    }
};

现在仍然不能解决CarInventory类持有堆栈对象指针的问题。

这个更好:

class CarInventory
{
    std::vector<std::shared_ptr<Car>> _cars;
 public:
    void displayVehicles()
    {
        for (auto i = _cars.begin(); i != _cars.end(); i++)
        {
            i->printInfo();
        }
    }
    void insert(std::shared_ptr<Car>& spCar)
    {
        _cars.push_back(spCar);
    }
};
然后你的代码使用类:
std::shared_ptr<Car*> createCar(const char* vin, const char* make, const char* color, int year)
{
    Car* car = new Car(vin, make, color, year);
    return std::shared_ptr<Car>(car);
}
int main(int argn, char *argv[])
{
   CarInventory cars;
   std::shared_ptr<Car*> toyota = createCar("2GCGC34M9F1152828", "Toyota", "Camry", "Green", 2012);
   std::shared_ptr<Car*> honda = createCar("1C4BJWAG4DL602733", "Honda", "Civic", "Blue", 2015);
    ...
    CarInventory cars;
    cars.insert(toyota);
    cars.insert(honda);
    cout << "n";
    cars.displayVehicles();
}