1

我正在尝试编写一段非常简单的代码来使用 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>另外,用 say替换每一个出现的地方int,然后一切都可以正常工作了。

4

4 回答 4

10

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

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

#include <vector>

int main ()
{
  std::vector<std::vector<int>> x(3, std::vector<int>(2));
}
于 2012-08-16T14:04:46.503 回答
4

您正在使用 "array" 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 ) );
于 2012-08-16T14:03:08.300 回答
3

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

您可以使用 a 大大简化您的代码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>
于 2012-08-16T14:03:53.520 回答
0

每个人都new需要一个delete

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

于 2012-08-16T14:03:59.027 回答