C++ 执行memset时出现Seg故障
在运行下面的程序时,我遇到了错误。但如果我评论memset,我并没有得到seg的错误。无法找出原因。如果需要清除结构内容(如值),我们可以做什么来代替memsetC++ 执行memset时出现Seg故障,c++,c++11,C++,C++11,在运行下面的程序时,我遇到了错误。但如果我评论memset,我并没有得到seg的错误。无法找出原因。如果需要清除结构内容(如值),我们可以做什么来代替memset #包括 #包括 #包括 使用名称空间std; 结构测试 { int值; 地图m; }; 无效打印(测试*ptr) { cout m.begin();itr!=ptr->m.end();+itr) { } } int main() { 测试对象; memset(&obj,0,sizeof(obj)); 打印(&obj); }
#包括
#包括
#包括
使用名称空间std;
结构测试
{
int值;
地图m;
};
无效打印(测试*ptr)
{
cout m.begin();itr!=ptr->m.end();+itr)
{
}
}
int main()
{
测试对象;
memset(&obj,0,sizeof(obj));
打印(&obj);
}
在不可复制的类型上调用memset
是未定义的行为()。std::map
不可复制,因此您的结构test
也不可复制
如果要将
value
设置为0,只需调用obj.value=0
,如果要清除m
,则可以调用obj.m.clear()
std::map
不是POD结构,因此它具有内部(如指针等),将在其构造函数中初始化
当您调用memset
时,您将整个结构归零,使得对它的任何访问都是未定义的行为
然后调用函数size()
,这会使代码崩溃,因为它现在试图读取零地址的任何内部地址
当您想要清除它时,应该使用指定的
std::map
->clear()
方法,而不是memset
。std::memset
仅适用于可复制的对象。对于像std::map
(它是test
的一个组件)这样的东西,这是未定义的行为
虽然int
将是一个INDEMINATE值,std::map
有一个默认构造函数,它将从自己的正确记账开始。但这被std::memset
打消了
在C++中,你几乎不需要<代码> STD::MyStase<代码> >
一个快速而肮脏的选项是测试
。此零初始化非类类型的值,如int
:
test obj{}
要重置它,您需要执行以下操作
obj = test{}
一个更好的选择是给
test
一个默认构造函数,它将m
设置为零。您应该在打印时使用segfault。当size()尝试获取任何内部指针时,它将被置零。即使在注释printf()后仍然获得seg错误。在结构中实现clear()
方法,不要将所有内容都设置为零。你不知道地图的内部状态是什么,把它夷为平地可能是个坏主意it@sureshmcpp.sh检查:cpp.sh/6sup6在打印时失败
@sureshm您不需要memset()
来初始化obj
。C++不是C。事实上,这样做时会拧坏内部地图成员。
obj = test{}