Использование clang (3.5.1) с дезинфицирующим средством для адреса в моей программе с использованием boost (1.56) Я получил: boost/serialization/singleton.hpp: 132: 13: ошибка времени выполнения: привязка ссылки обнулить указательboost serialization singleton and sanitizer: null reference
примером является:
#include<boost/serialization/singleton.hpp>
#include <string>
#include <iostream>
class Foo{
private:
std::string bar = "Hello World";
public:
void print() const{
std::cout << bar << std::endl;
}
};
int main(){
boost::serialization::singleton<Foo> test;
test.get_const_instance().print();
}
Тогда я:
сборник
clang++ -I/boost/1_56_0/gcc-4.8.2/include/ -fsanitize=address,undefined -std=c++11 test.cpp
выход
./a.out:
boost/1_56_0/gcc-4.8.2/include/boost/serialization/singleton.hpp:132:13: runtime error: reference binding to null pointer of type 'const Foo'
Hello World
Глядя на код, я смущен роли эталонного экземпляра в классе одноплодной. Это похоже на неопределенное поведение. Вы понимаете?
template<class T>
bool detail::singleton_wrapper<T>::m_is_destroyed = false;
} // detail
template <class T>
class singleton : public singleton_module
{
private:
BOOST_DLLEXPORT static T & instance;
// include this to provoke instantiation at pre-execution time
static void use(T const &) {}
BOOST_DLLEXPORT static T & get_instance() {
static detail::singleton_wrapper<T> t;
// refer to instance, causing it to be instantiated (and
// initialized at startup on working compilers)
BOOST_ASSERT(! detail::singleton_wrapper<T>::m_is_destroyed);
use(instance); // That's the line 132
return static_cast<T &>(t);
}
public:
BOOST_DLLEXPORT static T & get_mutable_instance(){
BOOST_ASSERT(! is_locked());
return get_instance();
}
BOOST_DLLEXPORT static const T & get_const_instance(){
return get_instance();
}
BOOST_DLLEXPORT static bool is_destroyed(){
return detail::singleton_wrapper<T>::m_is_destroyed;
}
};
Проблема, скорее всего, не в коде Boost, а в том, как вы ее используете. Измените свой вопрос, чтобы показать * ваш * код, предпочтительно [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –
Ярмарка. Я готовлю это. –
Я бы попробовал кипятить его дальше - вы можете сделать резус-код без использования Boost вообще, что было бы полезно, если бы вам нужно было указать ошибку в инструментах. –