【问题标题】:Deleting a pointer of vectors删除向量指针
【发布时间】:2012-08-12 21:38:58
【问题描述】:

我正在尝试编写一段非常简单的代码来使用 STL 向量创建一个 3x2 矩阵。
这就是我所拥有的:

#include <vector>
using namespace std;

int main ()
{

  int i;

  vector<int> * x = new vector<int> [3];

  for (i = 0; i < 3; i++)
       x[i] = vector<int> (2); 

  delete x;

  return 0;

}

问题是每次我运行程序时,它都会崩溃。如果我删除delete x,那么它工作正常,但可能会导致内存泄漏。

我知道这可能不是创建矩阵的最佳方式,而且有很多选择,但我只想知道为什么上述程序每次都崩溃。

另外,将每次出现的vector&lt;int&gt; 替换为int,然后一切正常。

【问题讨论】:

  • 尝试使用vector&lt; vector&lt;int&gt; &gt;;,不要再使用delete/new
  • 您使用 x 作为 x[] 但不删除作为 delete [] x 。为什么?
  • @rhalbersma:这是一个有效的答案。您应该将其作为答案而不是评论。
  • @Component10 已由 R. Martinho Fernandes 回答
  • 你应该试试 boost::scoped_array,甚至是 boost::numeric::ublas::matrix

标签: c++ pointers memory-management vector


【解决方案1】:

你正在使用“数组”new,所以你需要同样的 delete

delete[] x;
//....^^

在这里使用delete x; 是未定义的行为,所以任何事情都可能发生。你很幸运,你的程序崩溃了:)


不要这样做,除非你有充分的理由这样做。你可能有

std::vector< std::vector< int > > x;

那么你的代码会变成:

std::vector< std::vector< int > > x( 3 );
for( unsigned int ii = 0; ii < x.size(); ++ii )
{
    x[ ii ].resize( 2 );
}

甚至:

std::vector< std::vector< int > > x( 3, std::vector< int >( 2 ) );

我会这样做:

typedef std::vector< int > SomeLogicalName; // or just IntVector
std::vector< SomeLogicalName > x( 3, SomeLogicalName( 2 ) );

【讨论】:

    【解决方案2】:

    您需要使用delete [],因为您有一个动态分配的数组。你有向量的事实与它无关。

    您可以使用vector&lt;vector&lt;int&gt;&gt; 大大简化您的代码:

    vector<vector<int>> v(3); // holds three empty vector<int>
    

    甚至

    vector<vector<int>> v(3, std::vector<int>(2)); // holds 3 size 2 vector<int>
    

    【讨论】:

      【解决方案3】:

      每个new 都需要一个delete

      每个new [] 都需要一个delete []

      【讨论】:

        【解决方案4】:

        要销毁动态分配的数组,您必须使用delete[],而不是delete

        虽然这将使代码正常工作,但它是一个次优的解决方案。下面的程序做同样的事情,但更简洁,更安全。

        #include <vector>
        
        int main ()
        {
          std::vector<std::vector<int>> x(3, std::vector<int>(2));
        }
        

        【讨论】:

        • 你花了这么长时间! :-) 在 6 个delete[] 海报之后,终于找到了正确的方法。
        • 更不用说他的例子的最佳方法了,vector&lt;int&gt; x[3];(也可能是std::fill(std::begin(x), std::end(x), std::vector&lt;int&gt;(2));)。
        猜你喜欢
        • 2013-09-24
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        • 2012-06-01
        相关资源
        最近更新 更多