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

How to manage an array of pointers to objects?

本文关键字:对象 指针 数组 何管理 管理      更新时间:2023-10-16

我有一个对象指针数组的问题:(…

我需要生成一个对象的动态向量,然后返回它以便在另一个类中操作它。在下面的代码中有抽象的事件类和继承自它的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;

}

我以这种方式在另一个类中调用这个函数:


Event** cars = generator->getEvents();
for(int i=0; i<EVENTS; i++) {
    cout << i <<":" << (*cars)[i]->getScheduleTime() << endl;
}

在打印第一个元素后,我得到"Segmentation Fault"。

我在网上读了一些东西,我知道我错了,因为(*cars)的计算结果是a指针指向数组的第一个元素,实际上我可以打印第一个元素而不能打印其他元素,但是我不知道如何在第二个类中访问数组的每个元素。

我该如何面对?

谢谢大家,

阿尔贝托。

我建议您使用std::vector<Event*>代替。这样你会省去很多痛苦。它在后台处理所有令人讨厌的内存管理,并且您可以轻松地将任意数量的项目推入其中。在您的情况下,最好的部分是,您可以简单地returnvector,这是不安全的正常数组。

您的Event* cars[EVENTS];也在您的函数中局部声明。在您完成它之后,它就不存在了,这可能会导致您的段故障。您必须使用new动态分配数组,但仍然可以尝试使用std::vector,请参阅此处的文档。

编辑:示例用法:

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;
}

我认为处理动态分配对象的指针动态向量的最干净的方法是使用boost::ptr_vector。它处理你需要的一切,包括分配存储指针的空间,以及之后删除这些指针。

返回vector<Event*>vector<shared_ptr<Event>>而不是原始指针不是更好吗?这样您将获得:

  1. 内存管理自动化
  2. 动态数组,内置长度代替固定长度

正如Constantinuis所提到的,您正在返回一个指针的值,该指针指向的内存位置仅在getEvents()函数的作用域中有效(它在堆栈上分配)。下次你一定会出现分段故障。

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

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