-1

我写了一个简单的程序:

#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 流....

简直崩溃了。。

我找不到原因。。

4

2 回答 2

6

我假设你的意思是:

list<int> a = func();

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

尽管您返回一个引用,但您复制它,因为a它本身不是一个引用。以下将起作用:

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

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

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

无论如何,我希望这是出于教育目的(这很酷,因为您可以理解极端情况),但是对于生产代码,这将是非常非常错误的。

于 2012-09-26T15:38:56.917 回答
1

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

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

于 2012-09-26T15:39:20.607 回答