2016-12-16 41 views
1

我有一个包含静态成员变量的结构体。据称这个成员变量的析构函数中的一行从未被执行,这是由lcov报告的。这一行只能在程序终止时执行。所以我猜它只是lcov,不能算数。 Valgrind可以揭示这条线当然是按预期执行的。lcov报告不执行静态成员变量析构函数中的行

可以让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); 
    } 
} 

lcov results

回答

0

的gcov/LCOV是不能监视静态成员变量(和全局变量)的结构和破坏。但它们能够监视函数中的静态变量。