Я пытаюсь изучить распределители STL для void*. Вот мой код
#include <set>
#include <memory>
class Test {
public:
std::set<void*> GetAllInformation() { return info_set_; }
private:
std::set<void*> info_set_;
};
int main() {
std::unique_ptr<Test> test_obj_;
const auto info = test_obj_->GetAllInformation();
if (info.empty())
std::cout << "info empty";
return 0;
}
Но я получаю ошибку сегментации в
Поток 1 получил сигнал SIGSEGV, ошибка сегментации.
0x00402a18 в std::_Rb_tree<void*, void*, std::_Identity<void*>, std::less<void*>, std::allocator<void*> >::_M_root (this=0x0) в C :/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/lib/gcc/i686-w64-mingw32/8.1.0/include/c++/bits/stl_tree. ч: 733
stl_tree.h
_Const_Base_ptr
_M_root() const _GLIBCXX_NOEXCEPT
{ return this->_M_impl._M_header._M_parent; }
может ли кто-нибудь помочь объяснить? Спасибо
проблема заключается в том, что в настоящее время test_obj_
не указывает ни на какой Test
объект. Таким образом, выражение test_obj_->GetAllInformation()
приводит к неопределенное поведение.
Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.
Таким образом, результат, который вы видите (возможно, видите), является результатом неопределенного поведения. И, как я уже сказал, не полагайтесь на вывод программы с UB. Программа может просто крушение(что и происходит в вашем случае).
Например, здесь программа не вылетает, а здесь вылетает.
Таким образом, первым шагом для корректной работы программы будет удаление УБ. Тогда и только тогда можно начинать рассуждать о выводе программы.
1For a more technically accurate definition of undefined behavior see this where it is mentioned that: there are no restrictions on the behavior of the program.
Ошибка Seg возникает из-за
test_obj_->GetAllInformation()
, посколькуtest_obj_
не указывает ни на какойTest
объект.