通过指针删除分配的内存不起作用

Posted

技术标签:

【中文标题】通过指针删除分配的内存不起作用【英文标题】:Deleting allocated memory by pointer doesn't work 【发布时间】:2020-06-23 06:24:33 【问题描述】:

我正在使用包含 HTTP POST 请求的 QT 框架用 C++ 创建一个应用程序。 回复指针指向的值不会被删除并导致内存泄漏。 我试图像这样删除这个内存分配:

if (reply)

    qDebug() << "reply deleted";
    delete reply;

reply = m_qnam->post(request, jsonString);
qDebug() << reply;
connect(reply, SIGNAL(finished()), this, SLOT(handleNetworkData()));
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(handleSSLErrors()));

每当我尝试这样做时,程序都会立即崩溃。 在此类的标题中,回复以指针的形式启动:

QNetworkReply * reply;

有谁知道为什么我的程序通过删除指针指向的内存分配而崩溃?我的问题有什么可能的解决方案?

【问题讨论】:

你好拉乌尔。仅仅说你的程序崩溃并不足以让这里的任何人找到错误。我们只能猜测。最好将崩溃程序的输出添加到问题中。例如输出中是字符串“reply delete”吗?在代码中添加更多调试输出也是一个好主意。只是为了看看程序在哪里崩溃。例如。它可能会崩溃,因为请求对象会随着回复递归地被删除;那么m_qnam-&gt;post(request, jsonString) 将访问一个已删除的对象。 我得到以下输出,这不是很有帮助:11:39:19:开始 /home/pi/userInterface/build-userInterface-Pi4-Debug/userInterface... 回复已删除 11: 39:20:节目意外结束。 11:39:20:进程被强行结束。 11:39:20:/home/pi/userInterface/build-userInterface-Pi4-Debug/userInterface 崩溃。 我的水晶球认为你忘了给reply一个有效值。 如果我不删除回复,应用程序不会崩溃。所以我想我给回复一个有效的值。 reply 不为空并不意味着您可以删除它。它可能未初始化,在这种情况下删除它可能会使程序崩溃。 【参考方案1】:

也许你应该使用 reply.deleteLater()

【讨论】:

我也试过了。该程序不再崩溃,但并非我的应用程序 (UI) 的所有功能似乎都能正常工作。缺少一些组件。【参考方案2】:

您可能需要考虑改用智能指针(例如std::unique_ptr),而不是使用原始指针。

智能指针使用 RAII,其中 std::unique_ptr&lt;T&gt; 类的实例保存指针并在销毁时将其删除。

回答你的问题:它崩溃是因为reply = m_qnam-&gt;post(request, jsonString); 可能返回一个nullptr 而你(大概)尝试取消引用这个nullptr

【讨论】:

以上是关于通过指针删除分配的内存不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

修改矩阵后,通过内存指针(memptr)直接访问犰狳矩阵的条目不起作用

指针分配在递归函数中不起作用

调整动态分配的指针数组的大小(复制构造函数不起作用?)

C. 函数中的 malloc() 和 free() 不起作用 [重复]

堆栈指针的内存分配