在运行以下程序时,我遇到了段错误.但如果我评论memset,我不会得到seg错误.无法弄清楚原因.如果我需要清除结构内容(例如值),我们可以做什么而不是memset?
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
struct test
{
int value;
map<int, int> m;
};
void print(test *ptr)
{
cout << "map size() : " << ptr->m.size();
for(auto itr = ptr->m.begin(); itr != ptr->m.end(); ++itr)
{
}
}
int main()
{
test obj;
memset(&obj, 0, sizeof(obj));
print(&obj);
}
Run Code Online (Sandbox Code Playgroud)
std::map 不是POD结构,所以它有内部(如指针等),它将在它的构造函数中初始化.
当你调用时memset,你将整个结构归零,使得对它的任何访问都是未定义的行为.
然后你调用函数size(),这会导致代码崩溃,因为它会尝试读取现在处于零地址的任何内部函数.
而不是memset你应该使用指定的方法std::map- > clear(),当你想要清除它.
调用 memset 非易失性的类型是未定义的行为(https://en.cppreference.com/w/cpp/string/byte/memset). std::map 不是简单的可复制,因此你的结构 test 也不是.
如果你想设置value为0,你可以打电话obj.value = 0,如果你想清除m,你可以打电话obj.m.clear().