Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行memset时出现Seg故障_C++_C++11 - Fatal编程技术网

C++ 执行memset时出现Seg故障

C++ 执行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); }

在运行下面的程序时,我遇到了错误。但如果我评论memset,我并没有得到seg的错误。无法找出原因。如果需要清除结构内容(如值),我们可以做什么来代替memset

#包括
#包括
#包括
使用名称空间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{}