删除矢量指针

Deleting a pointer of vectors

本文关键字:指针 删除      更新时间:2023-10-16

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

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

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

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

你使用的是 "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 ) );

你需要使用 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>

每个new都需要一个delete

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