c ++内存泄漏与否

时间:2012-02-09 05:41:07

标签: c++ memory syntax

我有代码:

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)有任何问题;” ?

1 个答案:

答案 0 :(得分:1)

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

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

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

使用new时,或者使用其生命周期不是由类管理的资源(如malloc返回的内存或fopen返回的文件(而不是fstream 1}},这是一个类,当它被销毁时清理)),那时你需要确保清理它。

顺便说一句,最好的方法是将这些资源包装在一个通过构造函数和析构函数管理资源生命周期的类中,然后使用该类而不是“原始”资源;这被称为Resource Acquisition Is Initialization模式。