草庐IT

c++ - 使用 GCC 的函数检测,为什么使用 C++ STL 容器或流 I/O 会导致段错误?

我最近了解到使用GCC的代码生成功能(特别是-finstrument-functions编译器标志)可以轻松地向我的程序添加检测。我认为它听起来很酷,并在以前的C++项目中尝试过。在对我的补丁进行了几次修改之后,我发现每当我尝试使用STL容器或使用C++流I/O打印到标准输出时,我的程序都会立即因段错误而崩溃。我的第一个想法是维护一个std::list的Event结构typedefstruct{unsignedcharevent_code;intptr_tfunc_addr;intptr_tcaller_addr;pthread_tthread_id;timespects;}Event

c++ - 如何报告段错误?

我只是想知道如何报告段错误。进程会死掉,所以显然它不能报告它。除非进程传递信号,否则shell无法确定,但情况不一定如此。操作系统可能可以做一些事情,但我不确定怎么做。其中哪一个报告了段错误(只是一个例子),以及如何报告的? 最佳答案 Theprocesswilljustdie,soobviouslyitcannotreportit.这实际上是错误的。可以安装SIGSEGV处理程序来替换默认处理程序,它只会转储核心并死掉。预加载库可以这样做以捕获分段违规并使用有限的可用工具通知系统上运行的另一个进程在退出之前发生了什么。

c++ - 在段错误之前缺少 cout

我的代码中有一个段错误,所以我在可疑方法上放置了很多cout来定位位置。boolWybierajacyRobot::ustalPoczatekSortowania(){cout::iteratortmp;cout如果该方法被调用并且没有段错误,则打印来自T1和之前的每个cout。在++tmp行中是段错误,因为ostatnioUlozony是NULL,当方法转到T2时,没有first的每个cout都没有被打印出来。为什么?我正在使用Netbeansanggcc,我在Netbeans中发现了带调试的“段错误行”,但在我使用之前,我花了一些时间来添加cout行和运行程序。非常感谢,

c++ - 为什么在使用 std::map::insert() 时编译顺序有时会导致段错误?

我有一个类叫做Controller,在其中,我有一个名为Button的类.Controller包含几个Button不同类型的实例(例如button_type_a、button_type_b)。controller.h#ifndef__controller__#define__controller__classController{public:classButton{public:Button(inttype=-1);private:inttype;};Controller();ButtonA;ButtonB;ButtonX;ButtonY;};#endif按钮类型为ints,我希望能

c++ - 一个 "hack"来获取 float 模板参数工作编译但在 g++ 和 clang 上出现段错误

我知道whyIcan'tusefloatastemplateparameter以及如何设置模板类的staticconstfloat成员,这要归功于一对分子/分母。但我正在尝试另一个基于reinterpret_cast的“hack”,以从其IEEE754十六进制书写中“emule”float模板参数。这是一小段代码:#include#includetemplatestructMyStruct{staticconstfloatvalue;};templateconstfloatMyStruct::value=*reinterpret_cast(T);intmain(){typedefMyS

c++ - smart_ptr 到类段错误的属性

我想知道这个例子是否会导致段错误,因为对象的dtor被调用了,我仍然持有指向对象属性的shared_ptr。structfoo{std::shared_ptrconstbar=std::make_shared("foo");foo(){std::coutptr;{std::shared_ptrfoo_ptr=std::make_shared();ptr=foo_ptr->bar;}std::cout 最佳答案 不,它不会。通过将std::shared_ptr分配给另一个,您可以阻止它死亡。此操作ptr=foo_ptr->bar;会将

c++ - GCC 和 Clang 是否优化逐字段结构复制?

例如给予typedefstructA{inta;intb;intc;}A;typedefstructB{intd;inte;intf;}B;voidf(B&b1,A&a2){b1.d=a2.a;b1.e=a2.b;b1.f=a2.c;}f可以替换为memcpy(特别是如果结构有更多字段)。两个版本会产生相同的代码吗?如果我们复制到的结构的字段少于A怎么办?即typedefstructC{intg;inth;}C;voidh(C&c1,A&a2){c1.g=a2.a;c1.h=a2.b;}我很感兴趣,因为我生成的代码包括这样的结构拷贝,通常会更改字段的顺序,我想知道是否应该对这些情况进行

c++ - 当我将一个字符串放入节点->名称时,为什么会出现段错误(核心已转储)?

当我getline(cin,node->name)时出现段错误(核心转储)。我通过在我的输入函数中声明一个str字符串,然后node->name=str来修复。但是跑到cin>>node->year行,仍然遇到Segmentationfault。structclient{intcode;stringname;intyear;floatmaths,physics,chemistry;structclient*next;};structclient*input(){structclient*node=(structclient*)malloc(sizeof(structclient));c

c++ - 这段代码是否滥用了 STL 的 find_if?

假设我有一个存储在vector中的服务器名称列表,我想一次联系一个服务器,直到有人成功响应为止。我正在考虑以下列方式使用STL的find_if算法:find_if(serverNames.begin(),serverNames.end(),ContactServer());其中ContactServer是一个谓词函数对象。一方面,存在一个问题,因为谓词不会总是为相同的服务器名称返回相同的结果(因为服务器停机、网络问题等)。但是,无论使用谓词的哪个拷贝(即谓词没有真实状态),都会返回相同的结果,因此状态保持谓词的原始问题在这种情况下不相关。你说呢? 最佳答案

c++ - 仅当我将 stdout 重定向到/dev/null 时才会出现段错误?

我有一个C++单元测试,它向stderr生成有用的输出,并且大部分噪声(除非我正在调试)到stdout,所以我想将stdout重定向到/dev/null。奇怪的是,这样做似乎会导致段错误。是否有任何原因导致代码可能会使用“>/dev/null”出现段错误而在其他情况下运行良好?如果有任何影响,输出完全由printf产生。我很难发布有问题的代码,因为它是正在提交出版的研究。我希望根据此描述有一个“明显”的可能原因。事后分析段错误是由这样的代码引起的:ArrayElt*array=AllocateArrayOfSize(array_size);intindex=GetIndex(..)%a