函数调用后CPU指针异常变动,如何让其始终指向首个添加的进程?
解决Process指针异常变动的问题
你的问题核心出在局部对象的生命周期上,咱们一步步拆解并解决:
问题根源
你在addProcess()函数里创建的Process newProcess是栈上的局部变量——当函数执行完毕退出时,栈上的局部对象会被立即销毁,内存被系统回收。这时候你让CPU指针指向这个已经被销毁的对象,它就变成了「野指针」,后续任何对它的操作都会触发未定义行为,看起来就像是指针在“异常变动”。
解决方案
根据你的需求(CPU始终指向第一个添加到vector的进程),这里提供几种靠谱的实现方式:
方案1:让CPU指向vector中的元素(最推荐,依赖vector管理生命周期)
如果你的vector是vector<Process>(直接存储Process对象),可以让CPU直接指向vector的第一个元素。只要vector不被销毁、第一个元素不被移除,指针就始终有效。
// 假设类内私有成员: // vector<Process> processes; // Process* CPU = nullptr; void DiskSched::addProcess() { Process newProcess; newProcess.setProcessProperties(0, Header::PID, ++Header::TIME); processes.push_back(newProcess); // 仅当CPU为空时(也就是第一次添加进程),让它指向vector的第一个元素 if (CPU == nullptr) { CPU = &processes.front(); } }
⚠️ 注意:如果后续对vector执行push_back时触发扩容(vector容量不足时会重新分配内存),原有元素的内存地址会发生变化,CPU指针会失效。解决这个问题可以提前给vector预留足够容量:
// 在类的构造函数里添加: processes.reserve(100); // 预留100个元素的空间,根据你的需求调整
方案2:使用动态分配内存(手动管理生命周期)
用new在堆上创建Process对象,堆上的对象不会随函数结束而销毁,你可以手动控制它的生命周期。但要记得在合适的时机用delete释放内存,避免内存泄漏。
// 假设类内私有成员: // vector<Process*> processes; // Process* CPU = nullptr; void DiskSched::addProcess() { Process* newProcess = new Process(); newProcess->setProcessProperties(0, Header::PID, ++Header::TIME); processes.push_back(newProcess); if (CPU == nullptr) { CPU = newProcess; } } // 记得在类的析构函数里释放内存: DiskSched::~DiskSched() { for (auto proc : processes) { delete proc; } CPU = nullptr; }
方案3:使用智能指针(现代C++推荐,避免手动内存管理)
用std::unique_ptr或std::shared_ptr管理动态内存,不用手动调用delete,自动避免内存泄漏。
// 假设类内私有成员: // vector<std::unique_ptr<Process>> processes; // std::unique_ptr<Process> CPU; void DiskSched::addProcess() { auto newProcess = std::make_unique<Process>(); newProcess->setProcessProperties(0, Header::PID, ++Header::TIME); if (!CPU) { CPU = std::move(newProcess); // 转移智能指针的所有权 } processes.push_back(std::move(newProcess)); }
这种方式下,智能指针会自动在对象不再被使用时释放内存,无需手动管理。
额外提醒
- 确保
isEmpty()的逻辑正确,建议直接判断CPU是否为nullptr,比判断vector是否为空更直接。 - 如果选择方案1,尽量避免对vector执行会移除第一个元素的操作(比如
erase(processes.begin())),否则CPU会再次变成野指针。
内容的提问来源于stack exchange,提问作者TwasAGoodTaco
相关产品推荐
相关产品推荐

