Stefan B
Stefan B

Reputation: 541

c++ std chrono overflow

I am trying to implement a stopwatch for debugging as follows:

#include <chrono>

namespace sbstd
{
    class timer
    {
    private:
        bool m_running = false;
        std::chrono::time_point<std::chrono::system_clock> m_temp;
        std::chrono::nanoseconds m_time;
    public:
        void start()
        {
            if (m_running) { throw std::exception("timer already running"); }
            m_temp = std::chrono::system_clock::now();
            m_running = true;
        }

        void stop()
        {
            if (!m_running) { throw std::exception("timer not started"); }
            m_time += std::chrono::system_clock::now() - m_temp;
            m_running = false;
        }

        long long get_ms() const
        {
            return std::chrono::duration_cast<std::chrono::milliseconds>(m_time).count();
        }
    };
}

In the main method I have the following:

sbstd::timer t1;
t1.start();
std::this_thread::sleep_for(std::chrono::seconds(5));
t1.stop();
cout << t1.get_ms();

Instead of 5000 I get a negative int.

What is wrong?

Upvotes: 1

Views: 439

Answers (1)

bgfvdu3w
bgfvdu3w

Reputation: 1725

m_time is not initialised so its value is indeterminate - its just some garbage value. You probably want to initialise it to 0 - use std::chrono::nanoseconds::zero(). Here it is in action.

Upvotes: 1

Related Questions