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