我有一个程序,它有一个类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()
尝试将所述对象交给线程,但这也失败了。我知道我必须传入内存地址,并且我知道我希望将不同的对象分开,因为它们将执行不同的任务。
在需要创建一堆对象以在自己的单独线程中运行的情况下,如何解决泄漏内存的问题?
答案 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)
您可以将所有指针保存到已分配的对象(例如,在向量中),然后在连接线程后对它们进行删除。