lcov 报告未执行静态成员变量析构函数中的行

lcov reports that line in static member variables destructor is not executed

我有一个包含静态成员变量的结构。据称此成员变量的析构函数中的一行从未执行过,这是由 lcov 报告的。这一行只应在程序终止时执行。所以我猜它只是 lcov 无法计算它。 Valgrind 可以显示该行当然按预期执行。

是否可以让 lcov 计算这一行?

代码如下:

#include <cstdint> // uintX_t
#include <map>     // std::map
#include <deque>   // std::deque

struct foo
{
    struct bar
    {
        uint8_t* p;

        bar(uint8_t* const p_in) : p(p_in) {}
        ~bar()
        {
            if (p != nullptr)
            {
                delete[] p; // This line is allegedly never executed, reported by lcov
            }
        }

        bar(const bar&) = delete;
        bar& operator=(const bar&) = delete;

        uint8_t* get_p()
        {
            uint8_t* const tmp = p;
            p = nullptr;
            return tmp;
        }
    };

    static std::map<uint64_t, std::deque<bar>> storage;

    const uint32_t N;
    uint8_t* P;

    foo(const uint32_t n) : N(n)
    {
        if (storage[N].size() == 0)
        {
            P = new uint8_t[N];
        }
        else
        {
            uint8_t* const p = storage[N].back().get_p();
            storage[N].pop_back();
            P = p;
        }
    }

    ~foo()
    {
        storage[N].emplace_back(P);
    }
};

std::map<uint64_t, std::deque<typename foo::bar>> foo::storage;

int main()
{
    for (int i = 0; i < 2; ++i)
    {
        foo a(3);
        foo b(3);
    }
}

gcov/lcov无法监控静态成员变量(和全局变量)的构造和销毁。然而,他们能够监视函数中的静态变量。