2012-02-09 95 views
0

我有代碼:C++內存泄漏或不

class foo 
{ 
public: 
    bar(const QString& s){} 
..... 
}; 

int main() 
{ 
..... 
foo f; 
for(int i = 0; i < 100; i++) 
    f.bar(QString("%1").arg(i)); 
.... 
return 0; 
} 

我有字符串內存泄漏 「F(QString的(」 一些文本串 「));」或不?

又如

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

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

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

我有 「(QHostAddress(socket.bind」 192.168.20.1上串中的任何問題 「),50501);」 ?

+4

你的代碼不能編譯。我會先做。 – Sven 2012-02-09 05:44:45

+0

可能不是。 'QString'是爲了追蹤自己的記憶,而你只是傳遞一份副本。我假設'foo'有'xxx operator()(QString const&)'成員。 – 2012-02-09 05:45:19

+0

你的意思是f.bar(QString(「some string text?」)); ? – grieve 2012-02-09 05:46:19

回答

1

沒有內存泄漏。該QString類管理它自己的內存(假設你正在談論這個QString

您正在創建一個臨時的那類,調用foo::bar的回報。在這一點上,析構函數運行時被破壞,釋放任何內存由QString類舉行。

一般情況下,只要你的資源是由類管理的,而你不與new分配他們,你不必擔心釋放資源,析構函數會在運行時類實例超出範圍

當您使用new,或者使用其生命週期不受某個類管理的資源(如malloc返回的內存或fopen返回的文件(而不是fstream,這是一個類,並在被銷燬時會清理)),那就是當您需要確保清理它。

做到這一點的最好辦法,順便說一句,是通過構造函數和析構函數管理資源的生命週期一個類來包裝這些資源,然後用,而不是「原始」的資源,一流的;這被稱爲Resource Acquisition Is Initialization模式。