【问题标题】:How to manage an array of pointers to objects?如何管理指向对象的指针数组?
【发布时间】:2012-01-14 00:01:53
【问题描述】:

我对指向对象的指针数组有疑问:(..

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

打印第一个元素后,我得到“分段错误”。

我已经在网上阅读了一些内容,并且我知道我弄错了,因为 (*cars) 评估为 指向数组第一个元素的指针,实际上我可以打印第一个元素而不是另一个,但我不知道如何访问第二类中数组的每个元素。

我该如何面对?

谢谢大家,

阿尔伯托

【问题讨论】:

  • “我需要生成一个动态的vector对象”...嗯,如果只有std::vector...
  • 只有在你真的需要时才使用指针。尽可能使用 STL,它经过充分测试,可以为您省去很多麻烦。

标签: c++ arrays object pointers


【解决方案1】:

我建议您改用std::vector&lt;Event*&gt;。这样你会减轻很多痛苦。它负责后台所有令人讨厌的内存管理,您可以轻松地将任意数量的项目推入其中。在您的情况下,最好的部分是,您可以简单地使用 returnvector,这对于普通数组是不安全的。

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

【讨论】:

    【解决方案2】:

    我相信处理指向动态分配对象的动态指针向量的最简洁方法是use a boost::ptr_vector。它处理您需要的一切,包括分配存储指针的空间,以及之后删除这些指针。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        您可能希望在堆中为该数组分配内存(如果我的 C++ 不太生锈,则使用“new”),然后您必须稍后处理释放内存的问题。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-23
          • 2012-03-09
          • 2017-12-26
          • 1970-01-01
          • 2014-01-26
          • 2013-07-31
          • 1970-01-01
          • 2023-02-09
          相关资源
          最近更新 更多