删除矢量指针
Deleting a pointer of vectors
我正在尝试编写一段非常简单的代码来使用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 []
相关文章:
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存