如何管理对象的指针数组?

时间:2011-12-06 11:15:04

标签: c++ arrays object pointers

我遇到了一个指向对象的指针数组的问题:(..

我需要生成一个动态的对象向量,然后将其返回 为了在另一个类中操纵它。在下面的代码中有 抽象的事件类和从它继承的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时我误会了 指向数组的第一个元素的指针,实际上我可以打印第一个元素而不是另一个元素,但我无法弄清楚如何访问第二个类中数组的每个元素。

我怎么能面对这个?

感谢所有人,

阿尔贝托

4 个答案:

答案 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>>而不是原始指针会更好吗?这样你就可以获得:

  1. 内存管理自动化
  2. 内置长度而非固定长度的动态数组

答案 3 :(得分:2)

正如Constantinuis所提到的,您将返回指向内存位置的指针的值,该内存位置仅在getEvents()函数的范围内有效(它在堆栈上分配)。下次你一定会遇到段错误。

你可能想在堆中为这个数组分配内存(如果我的C ++没有太生锈的话,使用'new'),然后你将不得不处理以后释放内存的问题。

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter13.html