【发布时间】:2019-11-23 20:22:20
【问题描述】:
我想从一个线程返回一个std::pair<std::vector<int>, double>。
设置如下:
void* thread_run(void *);
int main(int argc, char* argv[]) {
std::pair<std::vector<int>, double> value;
pthread_t t;
pthread_create(&t, NULL, thread_run, NULL);
// wait
void* out;
pthread_join(t, &out);
value = *(std::pair<std::vector<int>, double> *)out;
free(out);
use(value);
}
void* thread_run(void* arg) {
std::pair<std::vector<int>, double> * out = (std::pair<std::vector<int>, double>*)
malloc(sizeof(std::pair<std::vector<int>, double>));
out->first = calc1();
out->second = calc2();
pthread_exit(out);
}
问题是我造成了内存泄漏。 Valgrind 报告说:
条件跳转或移动取决于未初始化的值并指向分配
out->first = calc1();统一化的值是由堆分配创建的,并指向 malloc 行。
我正在使用 gcc 5.4.0 & C++ 11 和 pthread 库。我需要使用 pthread。如何正确返回 C++ STL 容器以避免内存泄漏。
【问题讨论】:
-
使用
new,而不是malloc。 -
我的理解是std::thread没有取消机制。我需要一个取消机制。此外,如果走 malloc 路线,我是否必须放弃从线程返回 std 容器?
-
你应该放弃使用 malloc 创建 any C++ 对象。
-
使用
std::thread。对于取消机制,请执行pthread_cancel(std::thread::native_handle())Here is a example -
感谢大家的宝贵意见,我只能选择一个答案,但您的所有反馈都非常有价值。我希望 SO 中有一种方法可以奖励所有做出贡献的人。