默认分配的段错误 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 其中提到:没有对程序行为的限制.
我正在尝试学习 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
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 其中提到:没有对程序行为的限制.