用C ++编译向量数组

时间:2018-03-22 03:18:57

标签: c++ vector memory-leaks stdvector

我对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]的内存是自动释放的吗?如果是,何时? (在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 ++程序非常重要,因为我需要在一个大循环中使用向量数组。如果内存未正确释放,则程序运行时内存使用量会越来越大。在那种情况下,我的程序将崩溃。真的很感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

你所有的例子都很好。 std::vector负责清理它拥有的内存。这就是你使用它而不是原始指针的原因。

在您发布的所有案例中,您应该使用std::vector<std::vector<int>>代替。这将使您免于必须处理内存管理,并帮助避免轻松的错误,例如第三个示例中的rule of three违规。