删除向量指针

时间:2012-08-16 14:00:40

标签: c++ pointers memory-management vector

我正在尝试编写一段非常简单的代码来使用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<int>替换每次出现的int,然后再次正常工作。

4 个答案:

答案 0 :(得分:10)

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

虽然这会使代码工作,但这是一个次优的解决方案。以下程序做同样的事情,但是更加娴熟,更安全。

#include <vector>

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

答案 1 :(得分:4)

您正在使用“数组”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 :(得分:3)

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

您可以使用vector<vector<int>>

大大简化您的代码
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 :(得分:0)

每个new都需要delete

每个new []都需要delete []