【问题标题】:Qt/C++ QTcpSocket causes memory leak, not sure whyQt/C++ QTcpSocket 导致内存泄漏,不知道为什么
【发布时间】:2013-10-16 08:49:18
【问题描述】:

我正在创建一个简单的(ish)远程登录服务器,现在正在使用 valgrind 进行调试。代码运行良好,但 valgrind 抱怨程序终止时内存丢失......罪魁祸首是我创建新 QTcpSocket 的行:

void TelnetConnection::run()
{
    tcpSocketPtr = new QTcpSocket();  // ** remove this due to parent error
    if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
        emit error(tcpSocketPtr->error());
        return;
    }
}

我尝试将“this”传递给 QTcpSocket(),但随后我尝试连接的信号槽抱怨与不同的父级关联。这是问题吗?线索?还有……答案是什么?


我删除/释放 tcpsocketptr,如下所示为其分配值 0。对吗?

void TelnetConnection::clientDisconnected()
{
    tcpSocketPtr = 0; // ** Cure memory loss?
    TelnetConnection::s_clientCount--;
    Logger *log =  Logger::instance();
    log->record(Logger::Information,EVENTID_TELNET_DISCONNECTION,"Telnet client "+QString::number(m_clientNumber) +": Disconnecting");
    QThread::quit();  // Exit ths event loop for this thread
}

【问题讨论】:

  • 你在哪里 delete 那个 tcpSocketPtr
  • 我展示了当客户端断开连接时调用的代码......我希望释放为套接字分配的内存。这是正确的吗?
  • 你不deletetcpSocketPtr指向的内存区你只是清除指针(不对内存区和QTcpSocket对象做任何事情!)。

标签: c++ qt memory-leaks qtcpsocket


【解决方案1】:

每次调用“new”时,都必须调用“delete”。正如 cmets 所建议的,您将指针指向 0,但永远不要调用 delete。

编辑添加了一个很好地解释概念的 YT 视频:http://www.youtube.com/watch?v=_749lj2yb8Y 本质上,您永远不会释放您从 CPU 请求的内存,因此您会发生内存泄漏。一个简单的删除调用就可以解决这个问题。

【讨论】:

  • 哇——我的假设大错特错......我认为 c++ 有一个堆管理器在我之后清理。我将不得不使用删除。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多