2012-02-09 15 views
0

私は、コードを持っていますか否か?C++メモリリークか

別の例

class foo 
{ 
    QUdpSocket socket; 
public: 
    foo(); 
    void send_msq(); 
}; 

foo::foo(){ 
    socket.bind(QHostAddress("192.168.20.1"),50501); 
} 

void send_msq() 
{ 
    socket.writeDatagram(...); 
} 

私は、任意の文字列上の問題 "socket.bind(QHostAddress(" 192.168.20.1持っている ")、50501)を、" ?

+4

コードはコンパイルされません。私は最初にそれに取り組んでいます。 – Sven

+0

おそらくそうではありません。 'QString'は自身のメモリを追跡するためのもので、コピーを渡すだけです。 'foo'は' xxx operator()(QString const&) 'のメンバを持っていると仮定します。 –

+0

あなたはf.bar(QString( "some string text?"))を意味しましたか? ? – grieve

答えて

1

メモリリークはありません。 QStringクラスには、このQStringについて話していると仮定すると(独自のメモリを管理します。

あなたはときfoo::barリターンへの呼び出しに破壊され、そのクラスの一時的に作成している。その時点で、デストラクタがいずれかを解放し、実行していますQStringクラスが保持するメモリ

一般的に、リソースがクラスによって管理され、newで割り当てられていない場合、デストラクタは次のときに実行されるため、リソースの解放について心配する必要はありません。クラスインスタンスが範囲外になります。

を使用するとを使用するか、クラスによって寿命が管理されていないリソース(mallocによって返されたメモリやfopenによって返されたファイルなど)を使用することができます(これはクラスであり、破棄されると消去されます))、それをきれいにすることを確認する。

これを行う最善の方法は、そのようなリソースを、コンストラクタとデストラクタを介してリソースのライフタイムを管理するクラスにラップしてから、その "raw"リソースの代わりにそのクラスを使用することです。これはResource Acquisition Is Initializationパターンと呼ばれます。