1

以下が使用されない理由:

struct Foo
{
    int x;
};

int main()
{
    Foo &foo = *new Foo();
    foo.x = 7;
    std::cout << foo.x << std::endl;
    delete &foo;
}

結局のところ、可能な場合は参照を使用する必要があり、このアプローチを使用すると、最初に逆参照を行った後は、それを再び忘れることを心配する必要はありません。欠点は何ですか?

編集:

私は知っているoperator ->、ということを忘れることによって

int &n = *new int;
n = 7;
int *m = new int;
*m = 7; //here you can forget it
4

4 に答える 4

3

メモリリークが発生します。関数の最後で次のようにする必要があります。

delete &foo;

これは悪い考えです。

于 2013-05-11T00:37:45.410 に答える
2

これは、スマート ポインターと組み合わせて実行できます。

std::unique_ptr<Foo> p(new Foo);
Foo &foo = *p;
//...

その後、スコープの最後にメモリが適切に削除されます。

于 2013-05-11T00:47:26.113 に答える
1

このアプローチの目に見える欠点はありません。ただし、動的割り当てで参照を使用する必要がある場合、つまりT& t = *new T;、設計を再検討する必要があります。
なんで?なぜなら、

参照は、宣言時に初期化する必要があります。」

つまり、T& t;メモリを割り当てることはできません。
したがって、以下のステートメント:

T& t = *new T;  // (1) costly heap allocation (2) exception handling (3) need cleaning

以下の代わりにわずかに劣る:

T t;  // (1) cheaper auto allocation (2) no exception (2) no need to clean

したがって、参照を動的に割り当てることはできますが、それらが必要になることはほとんどありません。

于 2013-05-11T01:01:18.093 に答える
0

Re: 「可能な場合は参照を使用する必要があります」? この (悪い) アドバイスはどこから来たのですか?

Foo foo;
foo.x = 7;
std::cout << foo.x << std::endl;

ポインター、参照、フリー ストア、いいえdelete

しかし、フリー ストアから割り当てると、データ オブジェクトへのポインターが取得されます。絶対に必要でない限り、それを参照に変えないでください。

于 2013-05-11T13:19:11.887 に答える