【问题标题】:C++ Memory allocation question involving vectors涉及向量的 C++ 内存分配问题
【发布时间】:2010-05-07 20:39:26
【问题描述】:
vector< int > vect;
int *int_ptr = new int(10);
vect.push_back( *int_ptr );

我理解每个“新”之后都需要在某个时间点跟一个“删除”,但是 clear() 方法是否会清除此内存?

这种做同样事情的方法怎么样:

vector< int > vect;
int int_var = 10;
vect.push_back( int_var );

据我了解, clear() 调用变量析构函数,但此示例中的两个 vect.push_back() 方法都将对象推送到向量上,而不是指针。那么第一个使用 int 指针的例子是否需要 clear() 以外的东西来清理内存?

【问题讨论】:

    标签: c++ vector memory-management


    【解决方案1】:

    第一个方法泄漏是因为向量从不获取分配指针的所有权。事实上,它根本不包含指针,只是值的副本。

    第二种方法不会泄漏,因为没有动态分配内存(除了在向量内部——它将自己处理该内存)。

    【讨论】:

    • 当你说它会自己处理内存时,你的意思是在我调用 vector.clear() 之后?
    • vector被销毁时内存会被回收。 clear() 实际上不会释放任何内存;向量将保留容量,以防以后需要再次增长。
    • 那么是什么阻止我根本不使用指针而只是创建临时堆栈变量然后在需要时将它们推送到向量上?由于某种原因,指针失去了意义。
    • 完全有可能(甚至很可能)您根本不需要指针。通常只有当对象的生命周期需要超过创建对象的作用域的生命周期时才需要动态分配。
    • 我必须问,你说当向量被销毁时内存被恢复,所以当整个向量超出范围(或指向向量的指针被删除)时,给定内存,里面的所有东西都将被删除向量内部不是动态分配的?
    【解决方案2】:

    当您push_back on a vector 时,您会将数据的副本 添加到向量中。因此,在这两种情况下,仍然需要释放原始数据。在第一种情况下,您需要将其删除;第二,当它超出范围时,它将被堆栈指针“释放”。

    【讨论】:

      【解决方案3】:

      向量在 push_back 上进行复制。由于指针“只是另一个变量”(但恰好指向内存),当您 push_back 一个先前分配的整数指针时,您将指针的值复制到向量中,从而导致潜在的悬空指针,因为会有是指向内存中同一位置的两个指针。

      在您的第一个示例中,您需要手动删除内存。我过去用来干预图形类的一种策略是使用这样的东西(由于工作和快速打字而编辑了大量内容):

      class graph //quick-format
      {
      vector<node*> nodes;
      add_node(node n)
      {
        node *temp = new node; 
        *temp = n; 
        nodes.push_back(temp) 
      }
      ~graph()
      { 
         for(int i = 0; i < nodes.size(); i++) 
            delete nodes[i]; 
      }
      };
      

      需要注意的是,必须检查图的复制语义。就目前而言,它将导致删除以前释放的内存。优点是您始终可以使用相同的节点集。 Caveat Emptor,就像任何直接使用内存一样..

      但是,如果您只是简单地压入一个非指针变量,则不会有内存泄漏的可能性。向量可能会泄漏,但是……在工具成熟的这一点上,这实际上是不可能的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多