在 C++ 中破坏向量数组
Destruct array of vectors in C++
我对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;
}
问题1:在main()
函数的最后,我通过delete [] array_vec
手动删除了数组,但是我没有手动释放每个向量array_vec[i]
. array_vec[i]
的内存是自动释放的吗?如果是,什么时候? (before OR after my delete [] array_vec
?) 我问这个问题的原因是对于二维动态数组,我们必须在释放外部数组之前释放内部数组,所以我想知道向量数组是否也是如此。
2。向量数组作为临时变量出现在class的方法中
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;
}
问题二:array_vec[i]
是在myclass.myMethod()
返回之前发布的吗? OR array_vec[i]
只会在整个程序结束时释放?
3。向量数组在 class 中显示为 class 属性
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;
}
问题三:我的析构函数可以吗?在我的 ~myClass()
方法中,我只是释放向量数组 array_vec
,但我不知道这些向量本身是否会自动释放?如果是,那就太好了。如果没有,他们什么时候被释放?如何手动释放这些向量?
这个问题困扰了我很久。内存问题对我的 C++ 程序非常重要,因为我需要在大循环中使用向量数组。如果内存释放不当,程序运行时内存占用会越来越大运行。那样的话,我的程序就会崩溃。非常感谢您的帮助。
你所有的例子都很好。 std::vector
负责清理它拥有的内存。这就是您使用它而不是原始指针的原因。
在您发布的所有案例中,您应该改用 std::vector<std::vector<int>>
。这将使您完全不必处理内存管理,并有助于避免容易犯的错误,例如第三个示例中的 rule of three 违规。
我对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;
}
问题1:在main()
函数的最后,我通过delete [] array_vec
手动删除了数组,但是我没有手动释放每个向量array_vec[i]
. array_vec[i]
的内存是自动释放的吗?如果是,什么时候? (before OR after my delete [] array_vec
?) 我问这个问题的原因是对于二维动态数组,我们必须在释放外部数组之前释放内部数组,所以我想知道向量数组是否也是如此。
2。向量数组作为临时变量出现在class的方法中
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;
}
问题二:array_vec[i]
是在myclass.myMethod()
返回之前发布的吗? OR array_vec[i]
只会在整个程序结束时释放?
3。向量数组在 class 中显示为 class 属性
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;
}
问题三:我的析构函数可以吗?在我的 ~myClass()
方法中,我只是释放向量数组 array_vec
,但我不知道这些向量本身是否会自动释放?如果是,那就太好了。如果没有,他们什么时候被释放?如何手动释放这些向量?
这个问题困扰了我很久。内存问题对我的 C++ 程序非常重要,因为我需要在大循环中使用向量数组。如果内存释放不当,程序运行时内存占用会越来越大运行。那样的话,我的程序就会崩溃。非常感谢您的帮助。
你所有的例子都很好。 std::vector
负责清理它拥有的内存。这就是您使用它而不是原始指针的原因。
在您发布的所有案例中,您应该改用 std::vector<std::vector<int>>
。这将使您完全不必处理内存管理,并有助于避免容易犯的错误,例如第三个示例中的 rule of three 违规。