我遇到了一个指向对象的指针数组的问题:(..
我需要生成一个动态的对象向量,然后将其返回 为了在另一个类中操纵它。在下面的代码中有 抽象的事件类和从它继承的CarArrival 可以实例化。
在生成和填充数组的类中,我有这个函数:
Event** EventGenerator::getEvents() {
Event* cars[EVENTS];
for (int i=0; i<EVENTS; i++) {
cars[i] = new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4)));
}
sort(cars, cars+(EVENTS), Event::cmp);
return cars;
}
我以这种方式在onther类中调用这个函数:
Event** cars = generator->getEvents();
for(int i=0; i<EVENTS; i++) {
cout << i <<":" << (*cars)[i]->getScheduleTime() << endl;
}
打印完第一个元素后,我得到“Segmentation Fault”。
我已经在线阅读了一些内容,而且我明白自从(*汽车)评估为a时我误会了 指向数组的第一个元素的指针,实际上我可以打印第一个元素而不是另一个元素,但我无法弄清楚如何访问第二个类中数组的每个元素。
我怎么能面对这个?
感谢所有人,
阿尔贝托
答案 0 :(得分:5)
我建议你改用std::vector<Event*>
。你会以这种方式省去很多痛苦。它在后台处理所有令人讨厌的内存管理,您可以轻松地将任意数量的项目放入其中。在您的情况下,最好的部分是,您只需return
vector
这对于普通数组是不安全的。
此外,您的Event* cars[EVENTS];
在您的函数中声明为本地。完成后,它将不再存在,可能导致您的Segfault。您必须使用new
动态分配数组,但仍然可以使用std::vector
进行尝试,请参阅documentation here。
编辑:示例用法:
std::vector<Event*> EventGenerator::getEvents() {
std::vector<Event*> cars;
for (int i=0; i<EVENTS; i++) {
cars.push_back(new CarArrival(generator->getNextNumber(8,(float)sqrt(0.4))));
}
sort(cars.begin(), cars.end(), Event::cmp);
return cars;
}
std::vector<Event*> cars = generator->getEvents();
for(int i=0; i<cars.size(); i++) {
cout << i <<":" << (*cars)[i]->getScheduleTime() << endl;
}
答案 1 :(得分:3)
我认为处理动态分配对象指针的动态向量的最简洁方法是use a boost::ptr_vector
。它处理你需要的一切,包括分配存储指针的空间,以及之后删除那些指针。
答案 2 :(得分:2)
返回vector<Event*>
或vector<shared_ptr<Event>>
而不是原始指针会更好吗?这样你就可以获得:
答案 3 :(得分:2)
正如Constantinuis所提到的,您将返回指向内存位置的指针的值,该内存位置仅在getEvents()函数的范围内有效(它在堆栈上分配)。下次你一定会遇到段错误。
你可能想在堆中为这个数组分配内存(如果我的C ++没有太生锈的话,使用'new'),然后你将不得不处理以后释放内存的问题。
http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter13.html