【问题标题】:Vector of pointers: some clarification needed指针向量:需要一些说明
【发布时间】:2013-08-16 09:55:09
【问题描述】:

我在这个论坛上阅读了很多关于指针向量的内容,但无法理解删除存储在向量中的指针的想法。以下是我的查询:

假设我动态创建一个对象数组

CPoint* dynamic_array;
dynamic_array = new CPoint[30714];

我现在必须通过指针向量在另一个类的对象中使用这些值

vector<CPoint*> vector_of_pointers;

然后,我将使用以下方法将dynamic_array 的元素划分为另一个类的对象

Class B{
    vector<CPoint*> vector_of_pointers;
public:
    void function(CPoint* a){
        if (some condition){
            vector_of_pointers.push_back(a);
        }
};

其中a 将始终是指向来自dynamic_array 的对象的指针

然后我计划在对其对象的需求结束后删除最初创建的 dynamic_array。

delete[] dynamic_array;

即使在这样做之后,是否还需要删除向量中的每个指针?如果有必要,我可以在 Class B 的析构函数中这样做吗?

抱歉,这是一个简单或愚蠢的问题,但我是 C++ 新手,我的应用程序需要使用容器。

【问题讨论】:

  • 您很可能只想要一个std::vector&lt;CPoint&gt;。如果您需要指针,请使用智能指针。
  • 不需要删除vector的元素。事实上,这将是一个错误。调用delete[]`后,你不能取消引用元素。
  • 我认为这里的问题与内存所有权有关。删除 dynamic_array 后,向量中的指针将指向内存中的无效位置。始终如一地使用向量可能会有所帮助。您可能想查看 boost::ptr_vector 或 boost::shared_ptr

标签: c++ pointers vector dynamic-memory-allocation


【解决方案1】:

要回答您最初的问题:不,您不需要删除单个 CPoint 对象(实际上您不能)。

但我相信您最好使用vector&lt;CPoint&gt; 来存储实际点,而不是指向它的指针。

【讨论】:

    【解决方案2】:

    您存储在vector&lt;CPoint*&gt; 中的指针指向您已经使用delete[] dynamic_array 指令deleted 的对象,因此您不必也不应该在个人上添加delete 指令存储在向量中的指针。

    【讨论】:

      【解决方案3】:

      即使在这样做之后,是否还需要删除向量中的每个指针?如果有必要,我可以在 B 类的析构函数中这样做吗?

      答案是否定的,事实上你不能。

      使用std::vector 是否更好,我认为这取决于您的需求,但我可以确认使用new[] 比单独创建每个对象要快得多。有时:

      class CPoint {
      public:
          float x; float y;
      }
      
      const int N = 1e6;
      for(int i = 0; i < N; ++i)
      {
          new CPoint();
      }
      // 122 ms
      
      CPoint* points = new CPoint[N];
      // 0.00793176 ms
      
      std::vector<CPoint*> vectorPoints(N); // same as above
      // 4.48263 ms
      

      使用std::vector&lt;CPoint*&gt;(N) 也快,但不如new[]

      【讨论】:

        【解决方案4】:

        删除vector中指针指向的CPoint对象不是必须的,也是不可能的,但是vector中的指针必须从vector中删除。

        您必须清除该向量,因为它至少包含 4*number_of_elements(x64 系统中为 8*number_of_elements)个无用指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-07
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          • 2014-03-03
          • 1970-01-01
          相关资源
          最近更新 更多