foo
関数の終了時にmyClass
ポインタに何が起こりますか?自動的に削除されますか?C++ポインタに関する疑問
bar
の機能が終了したら、myThread
ポインタはどうなりますか?そうしない場合は(仮にQThread
オブジェクトへのmyThread
ポイントという)あなたがCにいる++ここでは、事前
foo
関数の終了時にmyClass
ポインタに何が起こりますか?自動的に削除されますか?C++ポインタに関する疑問
bar
の機能が終了したら、myThread
ポインタはどうなりますか?そうしない場合は(仮にQThread
オブジェクトへのmyThread
ポイントという)あなたがCにいる++ここでは、事前
で
void foo()
{
MyClass *myClass = new MyClass();
myClass->doSomething();
}
void bar()
{
// Suppose that MyThread is a QThread class
MyThread* myThread = new MyThread(2.5);
// Connect the Thread to get the result
connect(myThread, SIGNAL(sendResult(double)), this, SLOT(getResult(double)));
// Start the thread
myThread->start();
}
おかげで、誰もがあなたのオブジェクトを削除するつもりはないです。 new
の場合は、メモリを解放するためにdelete
と書く必要があります(malloc
にはすべてfree
が必要です)。
オブジェクトだけ削除されます:
void foo()
{
MyClass myClass;
myClass.doSomething();
}
はその後MyClass
のデストラクタをするときのfooを返す呼び出されます。一般に、オブジェクトがスコープ外に永続化されている必要がある場合を除いて、ポインタよりもオブジェクトが優先される場合、コード内のメモリリークが防止されます。考慮すべき
特別な例:あなたはstd::shared_ptrあるいはunique_ptrを使用した場合
注2つの溶液を混合したくない:QThreadのために、あなたが完了したら、それを削除するように依頼する必要があります。 When or how to delete QThread in Qtを参照してください。
可能なときにshared_pointerよりもunique_pointerを優先させるようにOPに指示する必要があります(ほとんどの場合)。また、必要でない場合は、ポインタを使用しないでください。 – dureuill
私はむしろユニークなポインタをお勧めしたいと思います。 – MikeMB
答えをありがとう。 bar関数では、スレッドオブジェクトへのポインタを作成しています。スレッドが終了したときにのみこのポインタを削除すべきですか?次に、グローバルスコープ内のポインタを他の関数(例えばgetResult(double))からアクセスできるように宣言する必要がありますか? – KelvinS
オブジェクトを 'new'でインスタンス化すると、' delete'が呼び出されるまで生き残ります。生ポインタを使用しているので、あなた自身で 'delete'を呼び出すか、' delete'の呼び出しを含む消費関数にそれらを渡すまで生き残ります。 –