1

オブジェクトがスコープ外に出た場合でも、オブジェクトがより長く存続する必要がある場合は、ポインターを使用する必要がありますよね?

ここでは、ムービー m; を作成します。. スタック上に作成され、スコープ外になると自動的に削除されます。

//In some header file
typedef struct{
Qstring name;
int id;
//...
} Movie ;


QList<Movie> movieList; //It's the same as the standard list of c++. 

//In a function somewhere else
void doSomething(/*...*/)
{
//Do something...
Movie m = { /* ... */ };
movieList.push_back( m );
}

リストは、引数として型 T の定数参照を取ります。それで住所ですよね?ただしMovie m;、範囲外になると削除されます。どういうわけか、リスト内のアイテムが残ります。

ただし、私の質問は、ポインターを使用Movie m;してヒープ上に作成する必要がありますか、それともこれで問題ありませんか? より良いスタイルとは?

4

1 に答える 1

2

「オブジェクトがスコープ外に出た場合でも、オブジェクトがより長く存続する必要がある場合は、ポインターを使用する必要がありますよね?」

実行がスコープ外になると、自動保存期間を持つローカル オブジェクトが自動的に破棄されることは事実ですが、動的に割り当てられたオブジェクトがより長く存続することを必ずしも意味しません。

アプリケーションには、グローバル変数があります。

QList<Movie> movieList;

プログラムの実行中ずっと存在するコンテナを表します。

「なぜかリストの項目が残る」

型のオブジェクトを作成Movieしてコンテナにプッシュすると、次のようになります。

Movie m;
...
movieList.push_back(m);

このオブジェクトのコピーがリストに保存されます。コピーはさまざまな状況で作成されますが、主に値渡しまたは値渡しの場合ですが、ほとんどの場合、プログラムのパフォーマンスに悪影響を与えることはありません。コンパイラがコピーを除外するために使用する多くの最適化手法があります...時には非常に効果的であるため、値による受け渡し/戻りが参照による受け渡しよりもさらに高速になる場合があります。

ポインターを使用Movie m;してヒープ上に作成する必要がありますか?

いいえ!オブジェクトの動的な割り当てを開始すると、自分でメモリ管理の責任を負うことになり、多くのことがそうでない場合よりもはるかに複雑になる可能性があります...可能性のある非常に頻繁な(通常はエラー処理の不完全性による)メモリリークの問題を含む、未定義の動作や他の多くの種類の不快なものの穴に陥る可能性のあるダングリングポインターの問題.

可能であれば、常に動的メモリ割り当てを避けてください。自動保存期間を持つオブジェクトを使用し、 RAII イディオムについて学び、それに従うことを楽しんでください。

于 2013-09-29T19:36:17.283 に答える