通过指针删除分配的内存不起作用
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->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<T>
类的实例保存指针并在销毁时将其删除。
回答你的问题:它崩溃是因为reply = m_qnam->post(request, jsonString);
可能返回一个nullptr
而你(大概)尝试取消引用这个nullptr
。
【讨论】:
以上是关于通过指针删除分配的内存不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?
修改矩阵后,通过内存指针(memptr)直接访问犰狳矩阵的条目不起作用