You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向Parking_Lot类数组添加对象触发0xC0000005访问违例问题排查

问题分析与修复方案

你遇到的0xC0000005: Access violation writing location 0x0000000000000000错误,本质是空指针访问——你的Parking_Lot类成员Lot根本没被正确初始化,一直是个空指针,所以当你在push里尝试给Lot[front++]赋值时,就会触发内存访问违规。

核心错误点

看你的构造函数代码:

Parking_Lot::Parking_Lot(int s) {
    Cars* Lot = new Cars[s+1]; // 这里的Lot是构造函数的局部变量!
    size = s;
    front = 0;
}

你在这里声明了一个局部的Lot指针,它和类成员变量的Lot重名了——这就导致类成员的Lot完全没被赋值,依然是默认的空指针(nullptr)。当构造函数执行完毕,这个局部的Lot会被销毁,类里的Lot还是空的,后续push里访问Lot[front++]自然就会写空指针指向的内存,触发崩溃。


修复步骤

1. 修正构造函数,正确初始化类成员Lot

把构造函数里的局部变量声明去掉,直接给类成员赋值:

Parking_Lot::Parking_Lot(int s) {
    Lot = new Cars[s+1]; // 直接给类成员Lot分配内存,不再声明局部变量
    size = s;
    front = 0;
}

这样类成员Lot就会指向你分配的动态数组,后续push里的访问就合法了。

2. 添加析构函数避免内存泄漏

因为你用了new[]分配数组,必须手动用delete[]释放内存,否则会造成内存泄漏:

Parking_Lot::~Parking_Lot() {
    delete[] Lot; // 注意用delete[]对应new[]分配的数组
}

额外优化建议(更安全的写法)

手动管理动态数组很容易出这种指针错误,建议改用C++标准库的std::vector<Cars>代替,它会自动管理内存,代码更简洁安全:

  1. 先把类里的Cars* Lot;成员改成std::vector<Cars> Lot;
  2. 修改构造函数:
#include <vector> // 需要包含头文件

Parking_Lot::Parking_Lot(int s) {
    Lot.reserve(s+1); // 预分配空间,提升性能(可选)
    size = s;
    // 可以用Lot.size()代替front变量,或者保留front也没问题
}
  1. 修改push里的赋值代码:
// 原来的Lot[front++] = car; 改成
Lot.push_back(car);
// 如果保留front,记得同步更新front的值,比如front = Lot.size();

这样你就不用自己写析构函数了,std::vector会自动在对象销毁时释放内存,也不会出现空指针的问题。


小提醒:时间判断逻辑可能有问题

顺便说一句,你代码里的时间判断条件if (Today.tm_hour < OpeningT.tm_hour && Today.tm_hour > ClosingT.tm_hour)逻辑是矛盾的——一个小时数不可能同时小于开门时间又大于关门时间,比如如果营业时间是8:00到20:00,凌晨2点的情况根本不会触发这个条件,建议重新梳理营业时间的判断逻辑,不过这不是当前崩溃的原因,只是个潜在问题。

内容的提问来源于stack exchange,提问作者Reshef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:20:05