带有迭代器的c++ vecotr不能被销毁?

问题描述 投票:0回答:1

最近我遇到一个问题,程序运行时内存不断增加,当程序关闭时内存会恢复正常水平。显然,这是内存泄漏。经过一些工作,我找到了负责的代码,但我不知道为什么?该程序的工作流程很简单:

  1. 首先使用激光雷达API获取点云和图像数据;
  2. 然后传输到下一个tbb流程图来处理这些数据;
  3. 最后使用 open3d api 来可视化它们。

第一步,激光雷达本身的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
。 为什么函数完成后向量不能自动销毁?希望有人能解释一下这个问题。

c++17
1个回答
0
投票

谢谢@退休忍者!问题的根源是

vector.reserve
只是储备容量而不是物理空间。所以保留后的向量空间为0。下面的迭代器操作假设指向一些未定义的内存。虽然结果可以传输到主函数而没有值错误,但在函数调用后,shared_ptr 使用计数不能减少到 1。

为了解决这个问题,只需将

reserve
修改为
resize
,即可将向量和迭代器指向的物理空间更改为定义的内存空间。或者避免使用迭代器,只需使用
push_back
并返回
back()

© www.soinside.com 2019 - 2024. All rights reserved.