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

Woo*_*kai 2 c++ heap multithreading pointers memory-management

我有一个使用自定义线程池类运行的多线程应用程序.线程都执行相同的功能,具有不同的参数.

这些参数通过以下方式提供给threadpool类:

// 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);
Run Code Online (Sandbox Code Playgroud)

一旦线程无关,它就会获得下一个参数并运行作业功能.我决定删除threadpool类中的参数:

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

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

为RtlFreeHeap指定的地址无效

奇怪的是,在一个案例中它完美地运行,但在另一个程序中它崩溃了这个错误.我尝试在其他地方删除指针:在执行作业功能后的线程中(我得到相同的堆损坏错误)或在作业函数本身结束时(在这种情况下没有错误).

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

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

至于我的代码.作业列表是结构的队列,由作业的id(以后能够获得特定作业的输出)和参数组成.

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

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;
}
Run Code Online (Sandbox Code Playgroud)

Rod*_*ddy 5

让我们把它转过头来:你为什么要使用指针?

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

没有新的,删除或指针......显然,一些实现细节可能会翘起,但你可以得到整体情况.

  • 一句话:模板! (2认同)