C修改指向结构的指针向量会导致未定义的行为
我有一个指向结构的指针向量,这些结构存储在我学校项目的另一个向量中.当我尝试使用指针更改结构中的元素时,由于某种原因导致未定义的行为.我删除了与下面问题相关的部分代码.
#include <vector> #include <string> #include <iostream> class someException{}; enum class ProcessStatus{ RUNNING,READY }; struct Process{ int priority; std::string PID; ProcessStatus status; Process(){ status = ProcessStatus::READY; } }; struct ReadyList{ std::vector<Process*> priority1; std::vector<Process*> priority0; }; class ProcessManager{ private: std::vector<Process> processList; ReadyList readyList; public: ProcessManager(){}; void createProcess(std::string PID,int priority){ Process process; process.priority = priority; process.PID = PID; if (priority == 0) process.status = ProcessStatus::RUNNING; processList.push_back(process); switch(priority){ case 0: readyList.priority0.push_back(&processList.at(processList.size()-1)); break; case 1: readyList.priority1.push_back(&processList.at(processList.size()-1)); break; default: throw someException(); } schedule(findRunningProcess()); } void printProcesses(){ std::cout<<"ReadyList results:"<<std::endl; for(auto &process: readyList.priority0){ std::cout << "Process: "<< process->PID << ",Priority: "<<process->priority; if (process->status == ProcessStatus::RUNNING) std::cout << ",Status: RUNNING"<< std::endl; else std::cout <<",Status: READY"<<std::endl; } for(auto &process: readyList.priority1){ std::cout << "Process: "<< process->PID << ",Status: READY"<<std::endl; } std::cout<<"ProcessList results: "<<std::endl; for(auto &process: processList){ std::cout << "Process: "<< process.PID << ",Priority: "<<process.priority; if (process.status == ProcessStatus::RUNNING) std::cout << ",Status: READY"<<std::endl; } } private: void schedule(Process* currentProcess){ Process* highestPriorityProcess; if (readyList.priority1.size()>0) highestPriorityProcess = readyList.priority1[0]; else highestPriorityProcess = readyList.priority0[0]; if (currentProcess->priority < highestPriorityProcess->priority){ currentProcess->status = ProcessStatus::READY; highestPriorityProcess->status = ProcessStatus::RUNNING; } } Process* findRunningProcess(){ for (auto &process: processList){ if (process.status == ProcessStatus::RUNNING){ return &process; } } return nullptr; } }; int main(){ ProcessManager pm = ProcessManager(); pm.createProcess("ROOT",0); std::cout<<"After creating process ROOT"<<std::endl; pm.printProcesses(); pm.createProcess("A",1); std::cout<<"After creating process A"<<std::endl; pm.printProcesses(); return 0; }; 输出结果如下: After creating process ROOT ReadyList results: Process: ROOT,Priority: 0,Status: RUNNING ProcessList results: Process: ROOT,Status: RUNNING After creating process A ReadyList results: Process: ROOT,Status: RUNNING Process: A,Priority: 1,Status: READY Process: A,Status: RUNNING ProcessList设置为正确的值,进程A正在运行并处理ROOT就绪,但由于某种原因,ReadyList保持不变.在我的原始代码中,读取列表中进程ROOT的PID字符串值变为空,并且在更改状态后,我在此示例中遗漏的进程中存储的映射值也被清除. 解决方法
每次你:
processList.push_back(process); 矢量可能会调整大小.这意味着支持向量的数据存储区将被复制到新的数据存储区中,然后被丢弃.这将为您提供另外两个向量,其中包含已释放并可能已重新分配的内存指针. processList是一个使用std :: list或std :: deque的好地方,因为它们在增长时不会使指针无效. std :: deque应该具有一些性能优势,因为它往往具有更好的空间局部性. 另一种方法是让其他两个向量存储processList中的进程索引,因为只要你只回退并且不删除进程它们就不会改变. 在任何一种情况下,从processList中删除进程而不确保它们首先从其他向量中删除将是一个坏主意. std :: deque处于不利之处,如果你有 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- openstack swift 的UI客户端(windows版)
- C#捕获在ThreadPool中发生的异常
- solr全文检索技术学习(二)-schema.xml配置解析
- 数据库设计 – MongoDB:存储以及何时使用关系
- Flexfields FNDSQF Debugger
- c# – 其ownerType不是DependencyObject的DependencyProper
- C语言实现堆排序代码
- SQLite3学习与Wince下文件绝对路径
- net.sf.json.JSONException: 'object' is an ar
- ruby-on-rails – OS X Ruby on Rails PATH安装问题