删除在不同函数中动态分配的对象时发生崩溃

时间:2012-09-26 15:35:28

标签: c++ new-operator delete-operator heap-corruption

我写了一个简单的程序:

#include<iostream>
#include<list>
using namespace std;
list<int>& func();

int main(){
    list<int> a = func();
    delete &a;
    std::cout<<"Here\n";
}

list<int>& func(){
    list<int>* ptr = new list<int>;
    return *ptr;
}

此程序从不将Here打印到cout流....

它只是崩溃..

我无法找到原因..

2 个答案:

答案 0 :(得分:6)

我猜你的意思是:

list<int> a = func();

因为否则它甚至不会编译。无论如何,变量a从未与new一起分配。它是func返回引用的变量的副本。

虽然您返回了引用,但您复制它是因为a本身不是引用。以下方法可行:

list<int>& a = func();
delete &a;

崩溃:http://ideone.com/T3Iew

作品:http://ideone.com/ONVKU

无论如何,我希望这是出于教育目的(这很酷,因为你可以理解角落案例),但对于生产代码,这将是非常非常错误。

答案 1 :(得分:1)

因为您声明为指针而不是引用。将list<int>* a更改为list<int> & a

但请不要试图在生产代码中做那种事情。