我遇到了这个我今天无法解释的问题。
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);
但我无法解释,为什么有双重免费?
答案 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
永远不会被释放。