默认分配的段错误 std::set<void*>

Seg fault with default allocation std::set<void*>

我正在尝试学习 void* 的 STL 分配器。这是我的代码

#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 in std::_Rb_tree, std::less, std::allocator >: :_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.h :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 的程序的输出。该程序可能 崩溃 (这就是您的情况)。

例如,here the program doesn't crash but here它崩溃了。

因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。


1有关未定义行为的技术上更准确的定义,请参阅 this 其中提到:没有对程序行为的限制.