最近我遇到一个问题,程序运行时内存不断增加,当程序关闭时内存会恢复正常水平。显然,这是内存泄漏。经过一些工作,我找到了负责的代码,但我不知道为什么?该程序的工作流程很简单:
第一步,激光雷达本身的api使用asio异步调用一些回调函数来传输数据,所以我创建了一些tbb
concurrent_queue
来存储这些数据,并创建了一个align函数来将云和图像与时间戳进行匹配。问题出在对齐函数上。在函数中,我创建了一个 vector<shared_ptr<open3d::..::PointCloud>>
并使用迭代器来存储点云元素。但是,我发现当函数完成时,shared_ptr使用计数不会减少。类似但更简单的示例代码如下:
std::pair<std::shared_ptr<int>, int> helper() {
auto a = std::make_shared<int>(90);
auto c = 100;
std::vector<std::pair<std::shared_ptr<int>, int>> container;
container.reserve(5);
auto iter = container.begin();
for (int i = 0; i < 3; i++) {
*iter = std::make_pair(a, c);
iter++;
}
return *(iter-1);
}
int main() {
auto b = helper();
std::cout << "shared_ptr use count: " << std::get<0>(b).use_count() << std::endl;
return 0;
}
Ubuntu 20.04 + gcc 9.4,打印结果为
shared_ptr use count: 4
。
为什么函数完成后向量不能自动销毁?希望有人能解释一下这个问题。
谢谢@退休忍者!问题的根源是
vector.reserve
只是储备容量而不是物理空间。所以保留后的向量空间为0。下面的迭代器操作假设指向一些未定义的内存。虽然结果可以传输到主函数而没有值错误,但在函数调用后,shared_ptr 使用计数不能减少到 1。
为了解决这个问题,只需将
reserve
修改为resize
,即可将向量和迭代器指向的物理空间更改为定义的内存空间。或者避免使用迭代器,只需使用 push_back
并返回 back()
。