我有代码:
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)有任何问题;” ?
答案 0 :(得分:1)
没有内存泄漏。 QString
类管理自己的内存(假设您正在讨论此QString
。
您正在创建该类的临时表,该表在foo::bar
的调用返回时被销毁。此时,运行析构函数,释放QString
类所拥有的任何内存。
通常,只要您的资源由类管理,并且您没有使用new
分配它们,您就不必担心释放资源,因为析构函数将在类实例运行时运行超出范围。
使用new
时,或者使用其生命周期不是由类管理的资源(如malloc
返回的内存或fopen
返回的文件(而不是fstream
1}},这是一个类,当它被销毁时清理)),那时你需要确保清理它。
顺便说一句,最好的方法是将这些资源包装在一个通过构造函数和析构函数管理资源生命周期的类中,然后使用该类而不是“原始”资源;这被称为Resource Acquisition Is Initialization模式。