2012-02-09 96 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模式。