【发布时间】:2018-03-22 03:18:56
【问题描述】:
我对 STL 向量以及向量数组的破坏过程有疑问。我从老师那里学到的唯一一件事是delete 的数量等于new 的数量。对于不同上下文中的向量数组,我有 3 个问题。为方便起见,所有数组都有 5 个向量。每个向量有 1 个元素。
1.向量数组出现在 main.cpp
int main(){
int size = 5;
vector<int> *array_vec = new vector<int>[size];
for(int i=0; i<size; i++){
array_vec[i].push_back{i};
}
delete [] array_vec;
return 0;
}
问题一:在main()函数的最后,我手动删除了delete [] array_vec的数组,但是我没有手动释放每个向量array_vec[i]。 array_vec[i]的内存是自动释放的吗?如果是,什么时候? (在我delete [] array_vec之前OR之后?)我问这个问题的原因是对于2D动态数组,我们必须在外部数组之前释放内部数组,所以我想知道向量数组是否是这种情况。强>
2。向量数组作为临时变量出现在类的方法中
Class myClass{
public:
void myMethod(){
int size = 5;
vector<int> *array_vec = new vector<int>[size];
for(int i=0; i<size; i++){
array_vec[i].push_back(i);
}
delete [] array_vec;
}
}
int main(){
myClass myclass;
myclass.myMethod();
/** some other process in the program **/
return 0;
}
问题 2:array_vec[i] 是否在 myclass.myMethod() 返回之前发布?或者array_vec[i]只会在整个程序结束时发布?
3.向量数组作为类属性出现在类中
Class myClass{
public:
vector<int> *array_vec;
public:
~myClass(){
if(array_vec)
delete [] array_vec;
}
void Init(){
int size = 5;
array_vec = new vector<int>[size];
for(int i=0; i<size; i++){
array_vec[i].push_back(i);
}
}
void Use(){
std::cout<<array_vec[0][0]<<std::endl;
}
}
int main(){
myClass myclass;
myclass.Init();
myclass.Use();
/** some other process in the program **/
return 0;
}
问题 3:我的析构函数好吗?在我的~myClass() 方法中,我只是释放了向量数组array_vec,但我不知道这些向量本身是否会自动释放?如果是的话,那就太好了。如果没有,他们什么时候被释放?如何手动释放这些向量?
这个问题困扰了我很久。内存问题对我的 c++ 程序非常重要,因为我需要在一个大循环中使用向量数组。如果内存没有正确释放,程序运行时内存使用量会越来越大。在这种情况下,我的程序会崩溃。非常感谢您的帮助。
【问题讨论】:
-
new vector<int>[size]通常是个坏主意,std::vector<std::vector<int>>很好(或std::array<std::vector<int>, 5>)。 -
#3 打破了 3/5/0 的规则。
-
我不明白你为什么不在整个代码中使用
std::vector。std::vector的全部目的是不需要做new[]和delete[]。你的措辞array of vectors不是建议向量的向量吗? -
new和delete的使用都可以,事情确实得到了妥善清理,但你应该使用std::vector<std::vector<int>>,正如 Jarod 指出的那样,不要涉及new或 @987654348完全是@。 -
非常感谢大家。现在我将更改为向量的向量。这更容易使用。
标签: c++ vector memory-leaks stdvector