执行memset时出现Seg Fault

sur*_*h m -1 c++ c++11

在运行以下程序时,我遇到了段错误.但如果我评论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)

Ark*_*ady 7

std::map 不是POD结构,所以它有内部(如指针等),它将在它的构造函数中初始化.

当你调用时memset,你将整个结构归零,使得对它的任何访问都是未定义的行为.

然后你调用函数size(),这会导致代码崩溃,因为它会尝试读取现在处于零地址的任何内部函数.

Live Demo on cpp.sh

而不是memset你应该使用指定的方法std::map- > clear(),当你想要清除它.


Joh*_*qua 6

调用  memset 非易失性的类型是未定义的行为(https://en.cppreference.com/w/cpp/string/byte/memset). std::map 不是简单的可复制,因此你的结构  test 也不是.

如果你想设置value为0,你可以打电话obj.value = 0,如果你想清除m,你可以打电话obj.m.clear().