-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;
}

このプログラムは決してHerec ストリームに出力しません....

それは単にクラッシュします..

私は理由を見つけることができません..

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

参照ではなく、ポインタとして宣言されているためです。に変更list<int>* alist<int> & aます。

ただし、本番コードでそのようなことをしようとしないでください。

于 2012-09-26T15:39:20.607 に答える