C ++线程构造函数,使用new(object)创建内存泄漏

时间:2014-10-03 22:35:57

标签: c++ multithreading c++11 memory memory-leaks

我有一个程序,它有一个类A,我想在一个线程中运行。真的,A是一个工人,我将会有一些正在运行的,我想跟踪它们。我的问题是,当我用valgrind检查时,我当前这样做会导致内存泄漏。

#include <iostream>
#include <thread>
#include <vector>

class A {
    public:
        double foobar;

        A() : foobar(0) { };
        A(double newfoo) : foobar(newfoo) { };
        void runA(double asap) {
            foobar = asap;
            std::cout << "foobar is now index: " << foobar << std::endl;
        }
};

int main() {
    std::vector<std::thread> aThreads;
    for(int i = 0; i < 10; i++) {
        aThreads.push_back(std::thread(&A::runA, new A(1), i));
    }

    for(auto& t : aThreads) {
        t.join();
    }

    return 0;
}

所以我知道问题是new A(100)调用,我真的不知道如何处理这个问题。我的实际程序要大得多,因此泄漏了更多的内存,所以我想知道我能在这做什么。我尝试在for循环中创建对象,然后使用std::move()尝试将所述对象交给线程,但这也失败了。我知道我必须传入内存地址,并且我知道我希望将不同的对象分开,因为它们将执行不同的任务。

在需要创建一堆对象以在自己的单独线程中运行的情况下,如何解决泄漏内存的问题?

2 个答案:

答案 0 :(得分:4)

直接调用A,然后按值传递。

#include <iostream>
#include <thread>
#include <vector>

class A {
    public:
        double foobar;

        A() : foobar(0) { };
        A(double newfoo) : foobar(newfoo) { };
        void operator()(double asap) {
            foobar = asap;
            std::cout << "foobar is now index: " << foobar << std::endl;
        }
};

int main() {
    std::vector<std::thread> aThreads;
    for(int i = 0; i < 10; i++) {
        aThreads.push_back(std::thread(A(1), i));
    }

    for(auto& t : aThreads) {
        t.join();
    }

    return 0;
}

答案 1 :(得分:3)

您可以将所有指针保存到已分配的对象(例如,在向量中),然后在连接线程后对它们进行删除。