gpt4 book ai didi

C++内存泄漏与否

转载 作者:行者123 更新时间:2023-11-28 08:10:36 24 4
gpt4 key购买 nike

我有代码:

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("some string text?"));"上有内存泄漏还是不是?

另一个例子

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 相对,它是一个类,在它被销毁时进行清理)),那是您需要确保清理它的时候。

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

关于C++内存泄漏与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9205939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com