0

UPDATE: if i use libc++ to compile, then I'm getting the error but when I change the compiler to libstdc++ (GNU C++ standard library), the program will run without showing any errors.

I'm trying out some sample codes from the boost website and somehow I'm getting a bad access error while running this code. The code runs fine till it calls the destructor it seems.

-lmysqlclient -lm -lz -lboost_date_time -lboost_system -lboost_filesystem are linked.

does anyone know what im doing wrong?

#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer
{
public:
    printer(boost::asio::io_service& io)
    : strand_(io),
    timer1_(io, boost::posix_time::seconds(1)),
    timer2_(io, boost::posix_time::seconds(1)),
    count_(0)
    {
        timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
        timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
    }

    ~printer()
    {
        std::cout << "Final count is " << count_ << "\n";
    }

    void print1()
    {
        if (count_ < 10)
        {
            std::cout << "Timer 1: " << count_ << "\n";
            ++count_;

            timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
            timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
        }
    }

    void print2()
    {
        if (count_ < 10)
        {
            std::cout << "Timer 2: " << count_ << "\n";
            ++count_;

            timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
            timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
        }
    }

private:
    boost::asio::strand strand_;
    boost::asio::deadline_timer timer1_;
    boost::asio::deadline_timer timer2_;
    int count_;
};

int main()
{
    boost::asio::io_service io;
    printer p(io);
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io));
    io.run();
    t.join();

    return 0;
}

stack trace

Original image

Im not sure whether this is a stack trace ...

Robert
  • 57
  • 1
  • 8

1 Answers1

1

I built and ran your code on my Mac using gcc 4.2.1 without issue

samm$ g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
samm$ ./a.out
Timer 1: 0
Timer 2: 1
Timer 1: 2
Timer 2: 3
Timer 1: 4
Timer 2: 5
Timer 1: 6
Timer 2: 7
Timer 1: 8
Timer 2: 9
Final count is 10
samm$ 

I used this same toolchain to build my boost library

samm$ grep BOOST_LIB_VERSION /opt/local/include/boost/version.hpp 
//  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
#define BOOST_LIB_VERSION "1_53"
samm$ 

I suggest using the same toolchain to build boost and your application.

Sam Miller
  • 23,808
  • 4
  • 67
  • 87
  • i just used the "tutorial" at the boost site to build boost. I downloaded and installed a fresh Xcode and the command line tools. Then I downloaded boost 1_53_0 and ran `sudo ./bootstrap.sh --prefix=usr/local/` and installed it with `./b2 install`. I didnt change anything and Im at a loss here. I can use the other boost functions but only "thread" is giving me an error so far. I really want to use boost to make a timer... – Robert Mar 20 '13 at 22:47
  • `$ g++ --version i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.` `$ grep BOOST_LIB_VERSION /usr/local/include_64bit/boost/version.hpp // BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION #define BOOST_LIB_VERSION "1_53"` – Robert Mar 20 '13 at 22:53