C ++内存泄漏与否

c++ memory leak or not

本文关键字:泄漏 内存      更新时间:2023-10-16

我有代码:

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(...);
}

我对字符串"socket.bind(QHostAddress("192.168.20.1"(,50501(;"有任何问题?

没有内存泄漏。QString类管理自己的内存(假设您正在谈论此QString

您正在创建该类的临时,当对foo::bar调用返回时,该临时类将被销毁。此时,析构函数将运行,释放QString类持有的任何内存。

通常,只要您的资源由类管理,并且您没有使用 new 分配它们,就不必担心释放资源,因为析构函数将在类实例超出范围时运行。

当您使用 new 或使用其生存期不受类管理的资源时(例如 malloc 返回的内存或 fopen 返回的文件(与 fstream 相反,它是一个类并在销毁时进行清理((,这时您需要确保清理它。

顺便说一下,最好的方法是将这些资源包装在一个类中,该类通过构造函数和析构函数管理资源的生存期,然后使用该类而不是"原始"资源;这称为资源获取是初始化模式。