向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>代替,它会自动管理内存,代码更简洁安全:
- 先把类里的
Cars* Lot;成员改成std::vector<Cars> Lot; - 修改构造函数:
#include <vector> // 需要包含头文件 Parking_Lot::Parking_Lot(int s) { Lot.reserve(s+1); // 预分配空间,提升性能(可选) size = s; // 可以用Lot.size()代替front变量,或者保留front也没问题 }
- 修改
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

