通过引用c ++删除对象

时间:2014-06-30 14:39:19

标签: c++ memory-management

我遇到了这个我今天无法解释的问题。

int main(){
    vector<int> vec = subroutine();
    ...
    delete(&vec);
}

vector<int>& subroutine(){
    vector<int>* vec = new vector<int>();
    //Init the vec
    for(int i=0;i<vec.size();i++){
    ...
    }
    return *vec;
}

它出现了错误:

double free or corruption (out): 0X00007fffa145ff50

这绝对是该行的问题:

delete(&vec);

但我无法解释,为什么有双重免费?

3 个答案:

答案 0 :(得分:10)

您正在对delete未分配的内容调用new,因为您正在制作新媒体的副本。您可以通过不复制向量来“纠正”您的代码:

vector<int>& vec = subroutine();

但这种功能真的是在惹麻烦。解决这个问题的正确方法是按值返回向量。

vector<int> subroutine() {
    vector<int> vec;
    //Init the vec
    for(int i=0;i<vec.size();i++){
    ...
    }
    return vec;
}

答案 1 :(得分:1)

从函数返回时,会生成向量的副本,此时new内存已泄漏且无法到达;因此错误,你试图删除堆栈上的东西(而不是堆上)。

我看不出你需要new的原因;你可以试试这个。

vector<int> subroutine(){
    vector<int> vec;
    //Init the vec
    for(int i=0;i<vec.size();i++){
    //...
    }
    return vec;
}

按值返回vector

答案 2 :(得分:0)

vector<int> vec = subroutine();在这里你复制一份。你没有返回指针。返回指针引用的整个对象,在此行return *vec;上。

因此,您将明确删除main中的vec,然后在其范围结束时再次删除。

此外,vec中的subroutine永远不会被释放。