The Json::Value::null object is a global reference object. The rules of C++ allow other constructors from other translation units to access the Json::Value::null symbol before it is constructed, which means that the reference is bogus, and you get a segmentation violation for accessing it. That means if you have a global object that uses Json::Value in its constructor, it can easily crash, depending on the whim of the linker deciding what to link first.
The solution (which I have shown works in my private workspace) is to replace all instances of Json::Value::null with static function (say Json::Value::null_()) in the style of a Meyers Singleton. Then accesses to null_() will always be valid and not depend on a race condition of the global construction list.
const Value& Value::null_()
{
static const Json::Value nullStatic(nullValue);
return nullStatic;
}
// for backwards compatibility, we'll leave this global references around, but DO NOT
// use them in JSONCPP library code any more!
Json::Value& null = null_();
Json::Value& nullRef = null_();
and replaced all the references to null in the JSONCPP code to null_(). This works now and I can use Json::Value in a constructor of a global object without it crashing.