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

C++ lcov报告静态成员变量析构函数中的行未执行,c++,c++11,destructor,static-members,lcov,C++,C++11,Destructor,Static Members,Lcov,我有一个包含静态成员变量的结构。这个成员变量的析构函数中有一行据称从未执行过,这是由lcov报告的。这一行只应在程序终止时执行。所以我想这只是lcov无法计算的。Valgrind可以揭示这一行当然是按照预期执行的 有可能让lcov对这条线进行计数吗 代码如下: #include <cstdint> // uintX_t #include <map> // std::map #include <deque> // std::deque struct

我有一个包含静态成员变量的结构。这个成员变量的析构函数中有一行据称从未执行过,这是由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);
    }
}
#包括//uintX\t
#include//std::map
#include//std::deque
结构foo
{
结构条
{
uint8_t*p;
bar(uint8_t*常数p_in):p(p_in){
~bar()
{
如果(p!=nullptr)
{
delete[]p;//该行据称从未执行过,由lcov报告
}
}
条(常数条&)=删除;
条形图&运算符=(常量条形图&)=删除;
uint8_t*get_p()
{
uint8_t*常数tmp=p;
p=nullptr;
返回tmp;
}
};
静态std::地图存储;
康斯特32号;
uint8_t*P;
foo(const uint32_t n):n(n)
{
if(存储[N].size()==0)
{
P=新单元8_t[N];
}
其他的
{
uint8_t*const p=storage[N].back().get_p();
存储器[N]。弹出返回();
P=P;
}
}
~foo()
{
存储[N]。回位(P);
}
};
std::map foo::存储;
int main()
{
对于(int i=0;i<2;++i)
{
fooa(3);
富b(3),;
}
}

gcov/lcov无法监控静态成员变量(和全局变量)的构造和破坏。但是,它们能够监控函数中的静态变量。