Ошибка сегмента с выделением по умолчанию std::set<void*>

Я пытаюсь изучить распределители 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; }

может ли кто-нибудь помочь объяснить? Спасибо

Ошибка Seg возникает из-за test_obj_->GetAllInformation(), поскольку test_obj_ не указывает ни на какой Test объект.

Anoop Rana 21.03.2022 06:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

проблема заключается в том, что в настоящее время 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.

Другие вопросы по теме