Следующий код показывает, что инициализация общего объекта с адресом глобального или статического объекта неверна, так как глобальный объект удаляется, когда общий указатель выходит из области видимости.
class Dog() {
public:
void bark() {
cout << "Dog barks" << endl;
}
};
Dog g_Dog;
void test() {
shared_ptr<Dog> myDog(&g_Dog);
myDog->bark();
}
int main() {
test();
}
Вышеприведенный код вылетает.Насколько я понимаю, мы не должны инициализировать общие указатели со статическим или глобальным объектом и должны делать это только с объектами в куче.Это правильно?
Я видел следующий фрагмент кода в руководстве по буст-логу (https://www.boost.org/doc/libs/develop/libs/log/doc/html/log/tutorial/sinks.html)
#include <boost/core/null_deleter.hpp>
// We have to provide an empty deleter to avoid destroying the global stream object
boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
sink->locked_backend()->add_stream(stream);
Не могли бы вы, ребята, объяснить, почему код
boost::shared_ptr< std::ostream > stream(&std::clog, boost::null_deleter());
не делаетвызвать какие-либо проблемы. Похоже, что std :: clog является глональной или статической переменной. Не так ли? Почему это не создает риск быть уничтоженным, когда вышеуказанный общий указатель потока выходит из области видимости. Пожалуйста, пролите светСпасибо