删除指针有时会导致堆损坏

2023-12-12

我有一个使用自定义线程池类运行的多线程应用程序。这些线程都执行相同的函数,但参数不同。

这些参数通过以下方式传递给线程池类:

// jobParams is a struct of int, double, etc...
jobParams* params = new jobParams;
params.value1 = 2;
params.value2 = 3;

int jobId = 0;

threadPool.addJob(jobId, params);

一旦线程无事可做,它就会获取下一个参数并运行作业函数。我决定删除线程池类中的参数:

ThreadPool::~ThreadPool() {
    for (int i = 0; i < this->jobs.size(); ++i) {
        delete this->jobs[i].params;
    }
}

但是,这样做时,我有时会遇到堆损坏错误:

指定给 RtlFreeHeap 的地址无效

奇怪的是,在一种情况下它工作得很好,但在另一种程序中它会因这个错误而崩溃。我尝试在其他位置删除指针:在执行作业函数之后的线程中(我得到相同的堆损坏错误)或在作业函数本身的末尾(在这种情况下没有错误)。

我不明白从不同的地方删除相同的指针(我检查过,地址是相同的)如何改变任何东西。这与它是多线程的事实有什么关系吗?

我确实有一个关键部分来处理对参数的访问。我认为问题不在于同步访问。无论如何,只有在所有线程完成后才会调用析构函数,并且我不会在其他任何地方删除任何指针。指针可以自动删除吗?

至于我的代码。作业列表是一个结构体的队列,由作业的id(用于稍后能够获取特定作业的输出)和参数组成。

getNextJob()每次线程完成执行上一个作业时都会调用它(它们有一个指向线程池的指针)。

void ThreadPool::addJob(int jobId, void* params) {
    jobData job; // jobData is a simple struct { int, void* }
    job.ID = jobId;
    job.params = params;

    // insert parameters in the list
    this->jobs.push(job);
}

jobData* ThreadPool::getNextJob() {    
    // get the data of the next job
    jobData* job = NULL;

    // we don't want to start a same job twice,
    // so we make sure that we are only one at a time in this part
    WaitForSingleObject(this->mutex, INFINITE);

    if (!this->jobs.empty())
    {
        job = &(this->jobs.front());
        this->jobs.pop();
    }

    // we're done with the exclusive part !
    ReleaseMutex(this->mutex);

    return job;
}

让我们把这个问题反过来看:你为什么要使用指针?

class Params
{
int value1, value2; // etc...
}

class ThreadJob
{
  int jobID;  // or whatever...
  Params params;
}

class ThreadPool
{
  std::list<ThreadJob> jobs;

  void addJob(int job, const Params & p)
  {
     ThreadJob j(job, p);
     jobs.push_back(j);
  }
}

没有新的、删除的或指针...显然,一些实现细节可能是错误的,但你可以了解整体情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除指针有时会导致堆损坏 的相关文章

随机推荐

  • 在html表格中显示数组

    我有这个数组 Array page gt Array 0 gt add 1 gt edit 2 gt delete 3 gt search category gt Array 0 gt add 1 gt edit 2 gt export 我
  • 在构造函数中使用 T 创建通用组件

    我正在尝试制作一个通用组件来显示列表资源 我在 HTML 中实例化组件时遇到问题 我正在用这个answer试图解决这个问题 但我觉得这是行不通的 我有这个组件
  • pyinstaller后运行FastAPI多进程错误

    我正在使用具有多个处理器 5 个进程 的 UVICORN 运行 python FastAPI 它从代码中运行顺利 但是当我尝试从 pyinstaller 生成 exe 并尝试运行该文件时 它显示错误 文件名 main py import m
  • C# for 循环中使用括号和不使用括号的区别

    以下代码的输出与第二个代码的输出不同 有人可以解释这个问题吗 Code 1 for int i 1 i lt intInput i for int j 1 j lt i j Console Write Console WriteLine i
  • 是否真的可以使用自定义 HTTP 标头来防止 CSRF,因为浏览器会阻止站点将自定义 HTTP 标头发送到另一个站点?

    今天在研究CSRF 发现了下面这句话 自定义 HTTP 标头可用于防止 CSRF 因为浏览器 阻止网站将自定义 HTTP 标头发送到另一个网站 但 允许站点向自己发送自定义 HTTP 标头 这篇文章里面 https www invicti
  • 公开 VSCode 活动“when 子句上下文”的方法

    我正在寻找一种公开 VSCode 的方法active when 子句上下文 例如 explorerResourceIsFolder 为了让您更好地理解我的用例 以下是正在开发 VSCode 扩展的项目的一些背景信息 我的扩展将有助于通过语音
  • 主要的 .NET 3.0 模拟框架有哪些?

    首先 我喜欢 Moq 我希望可以在 NET 3 0 中使用它 然而遗憾的是 我不能 但我仍然想使用模拟来进行单元测试 另外 我以前用过Rhino 但我绝对讨厌它 不过 更具描述性的是 这是因为界面感觉笨重且不直观 这是可以处理的 而文档要么
  • R:使用“strsplit”耗尽内存

    我的内存不足strsplit 想必 这是代码 split fields lt function frame fields split suffix for field in fields v lt sapply strsplit frame
  • SSL 配置无法读取 server.crt 文件

    我想在这里完成本教程 创建自签名 SSL 证书 https devcenter heroku com articles ssl certificate self 我生成了 csr 密钥并生成了证书 csr 当我回到 ssl heroku 教
  • 如何从命令行检查 jvm 模块内容?

    我想从命令行检查本地安装的 jvm 的 java 模块的资源文件的内容 基于一个问题jvm 中的 mime 类型支持我想看看的内容 sun net www content types properties在模块中java base我本地安装
  • CSS 列表逐渐淡入,数量未知

    我试图使用普通 CSS 进行逐渐淡入淡出 并且列表中没有 jquery 这样它就可以一一淡入淡出 然而 我只知道如何在有限的列表中做到这一点 如何循环 css 以便无论我有多少列表 它仍然有效 这是我所做的 ladder opacity 0
  • 从传入消息 (SMS) 中获取 IMSI 号码或目标电话号码

    我正在开发一个应用程序 需要接收短信的设备 具有多个 SIM 卡 的 IMSI 电话号码 这基本上是为了识别哪个 SIM 卡正在接收短信并稍后执行进一步的操作 我彻底搜索了 SMSMessage Api 但没有找到合适的解决方案 任何帮助将
  • 命名空间“std”中没有名为“shared_ptr”的类型

    希望这对其他人有帮助 尝试使用 Cedar BDD 编译 iOS 项目一直失败 并出现命名空间 std 中没有名为 shared ptr 的类型错误消息 这显然是一个 C 错误 但无法理解为什么 Xcode 使用的 C 库没有定义共享指针类
  • Make 中模式规则的优先级

    我 大致 有这个 Makefile PHONY all SUFFIXES OUT www web all OUT index html rule 1 html in build html lt rule 2 OUT cp lt 这个 Mak
  • 从 Python 将密码传递给 runas [重复]

    这个问题在这里已经有答案了 我需要从我的脚本以另一个用户身份运行一个文件 而不提示输入密码 这是怎么做到的 有一个可执行程序叫做沙努尔程序这就是针对这种情况而设计的 您可以使用它在命令行上输入密码 如下所示 runas user domai
  • 如何使用sql在h2中插入几何图形

    从几个版本开始 h2 确实支持空间几何 在java中选择和插入几何图形不是问题 但是如何在纯sql中插入它们呢 文档显示它使用 WKT 但是当我尝试插入 WKT 时出现错误 这是一个示例插入 insert into feature id n
  • 类 java.util.Map 有泛型类型参数,请使用 GenericTypeIndicator 代替

    我正在使用 firebase 从数据库中检索数据 n 使用 Map
  • 在 __init__.py 中找不到引用“xxx”

    我在 PyCharm 中有一个项目组织如下 Sources init py Calculators init py Filters py Controllers init py FiltersController py Viewers in
  • Flex 订单属性未按预期工作

    我试图得到 通心粉和奶酪真的很好吃 在 网站的主要内容 下方 content padding 0 background 0 float none width auto heading display flex display webkit
  • 删除指针有时会导致堆损坏

    我有一个使用自定义线程池类运行的多线程应用程序 这些线程都执行相同的函数 但参数不同 这些参数通过以下方式传递给线程池类 jobParams is a struct of int double etc jobParams params ne