2017-02-08 3 views
0

foo関数の終了時にmyClassポインタに何が起こりますか?自動的に削除されますか?C++ポインタに関する疑問

barの機能が終了したら、myThreadポインタはどうなりますか?そうしない場合は(仮にQThreadオブジェクトへのmyThreadポイントという)あなたがCにいる++ここでは、事前

+2

オブジェクトを 'new'でインスタンス化すると、' delete'が呼び出されるまで生き残ります。生ポインタを使用しているので、あなた自身で 'delete'を呼び出すか、' delete'の呼び出しを含む消費関数にそれらを渡すまで生き残ります。 –

答えて

3

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を使用した場合

  • オブジェクトを自動的に削除することができた(Differences between unique_ptr and shared_ptrを参照してください)。
  • Qtオブジェクトは、あなたに通知することなくその子を自動的に削除することができます。参照:Memory management in Qt?(オブジェクトの子育てをサポートするすべてのSDKで同じかもしれません)。クリスチャンでコメントとして
  • は....そう、あなたが一緒に

注2つの溶液を混合したくない:QThreadのために、あなたが完了したら、それを削除するように依頼する必要があります。 When or how to delete QThread in Qtを参照してください。

+0

可能なときにshared_pointerよりもunique_pointerを優先させるようにOPに指示する必要があります(ほとんどの場合)。また、必要でない場合は、ポインタを使用しないでください。 – dureuill

+1

私はむしろユニークなポインタをお勧めしたいと思います。 – MikeMB

+0

答えをありがとう。 bar関数では、スレッドオブジェクトへのポインタを作成しています。スレッドが終了したときにのみこのポインタを削除すべきですか?次に、グローバルスコープ内のポインタを他の関数(例えばgetResult(double))からアクセスできるように宣言する必要がありますか? – KelvinS