草庐IT

bad_cast

全部标签

c++ - 如何避免 "(void)a"cast 导致副作用?

我有这段代码,GCC会打印“什么!?”。我怎样才能避免这种情况,所以voidActor只是有C意思“忽略孤独的'a;'”?#includestructA{templateoperatorT(){std::cout 最佳答案 如您所见,这是bugingcc.标准如下:c++1112.3.2Conversionfunctions[class.conv.fct](1)Aconversionfunctionisneverusedtoconverta(possiblycv-qualified)objectto[...](possiblycv-q

c++ - reinterpret_cast 奇怪(逗号分隔的表达式)

在调试我们的一些代码(C++)时,我发现了这个:inlinestd::stringBufferToStr(constunsignedchar*buffer,intindex,size_tlength){std::stringretValue(reinterpret_cast(&buffer[index],length));returnretValue;}这段代码的问题(忽略了缺少指针和字符串长度检查)是reinterpret_cast的右括号被放在length之后,而它应该有在&buffer[index]之后。起初我认为这是编译器的问题(使用VS2013),但在使用VS2012和gcc

C++ 构造 : "MyClass c" is bad, "MyClass c = MyClass()"很慢,我要 "MyClass c()"

这里有一些代码:classMyClass{public:inty;};intmain(){MyClassitem1;MyClassitem2=MyClass();}当我运行它时,我收到以下值:item1.y==[garbage]item2.y==0这让我很惊讶。我希望item1是默认构造的,而item2是从MyClass的匿名默认构造实例复制构造的,导致两者都等于0(因为默认构造函数将成员初始化为默认值)。检查程序集://MyClassitem1;//MyClassitem2=MyClass();xoreax,eaxmovdwordptr[ebp-128h],eaxmovecx,dwo

c++ - 捕获 std::bad_alloc 的策略

所以我在开发过程中经常使用Qt并且喜欢它。Qt对象的通常设计模式是使用new分配它们。几乎所有示例(尤其是Qt设计器生成的代码)都绝对不检查std::bad_alloc异常。由于分配的对象(通常是小部件等)很小,这几乎不是问题。毕竟,如果您未能分配20字节之类的内容,那么您可能无法解决问题。目前,我采用了将“大”(大小超过一页或两页的任何内容)分配包装在try/catch中的策略。如果失败,我会向用户显示一条消息,几乎任何更小的消息,我都会让应用程序崩溃并出现std::bad_alloc异常。那么,我想知道这方面的学派是什么?检查每个new操作是否是好的策略?还是只有我认为有可能失败的

c++ - 为什么 C 风格的类型转换可以工作,但 reinterpret_cast 不能?

所以我有一个两个字符数组unsignedcharv[2];我想将v[0]的值显示为0到255之间的数字,但是cout所以我尝试了cout或printf("%d\n",v[0]);这正是我想要的,但我一点也不喜欢。另外我完全不明白为什么这不起作用:cout(v[0]) 最佳答案 (通俗地说)reinterpret_cast用于以实现定义的方式将对象的位解释为另一种类型。您不希望这样:您想要转换(从char到int)。请改用static_cast。(reinterpret_cast的所有可能用途都列在5.2.10中;这不是其中之一。)

c++ - reinterpret_cast、char* 和未定义的行为

reinterpret_castingachar*(或char[N])在哪些情况下是未定义行为,何时定义行为?我应该使用什么经验法则来回答这个问题?我们从thisquestion了解到,以下是未定义的行为:alignas(int)chardata[sizeof(int)];int*myInt=new(data)int;//OK*myInt=34;//OKinti=*reinterpret_cast(data);//但是在什么时候我们可以对char数组执行reinterpret_cast并且让它不是未定义的行为?下面是几个简单的例子:没有new,只有reinterpret_cast:al

C++20 bit_cast 与 reinterpret_cast

根据ISOC++委员会的最后一次session,bit-cast将在C++20标准中引入。我知道reinterpret_cast不适合这份工作,因为typealiasingrules但我的问题是,为什么他们选择不扩展reinterpret_cast以将对象视为位序列表示,而更愿意将此功能作为一种新的语言结构提供? 最佳答案 嗯,有一个明显的原因:因为它不会做bit_cast所做的所有事情。即使在我们可以在编译时分配内存的C++20世界中,reinterpret_cast也被禁止在constexpr函数中使用。bit_cast的明确目

c++ - 使 auto_cast 安全

GMan已发布deliciousauto_cast“operator”的代码允许在C++中编写如下代码:floatf=4.0f;inti=auto_cast(f);//insteadof:intj=static_cast(f);或者,更重要的是,Tx=value;typenamenested_type::typey=auto_cast(x);//insteadoftypedeftypenamenested_type::typemy_type;my_typez=static_cast(x);基本上,操作符非常擅长从static_cast中删除不必要的冗余,同时仍然是安全。它甚至比stat

c++ - 当一个类在构造函数中动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc?

我创建了一个使用new递归创建自身的类(只是为了好玩!),预计由于无限动态分配(堆)这将抛出std::bad_alloc溢出)。但是发生堆栈溢出而不是std::bad_alloc。为什么会这样?classOverflow{private:Overflow*overflow;public:Overflow(){overflow=newOverflow();}};intmain(){Overflowoverflow_happens;//stackoverflowhappensinsteadofstd::bad_allocexeption}@Caleth询问如果我将newOverflow()

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

简介让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。设置我定义了两个接口(interface),A和B:classA//Aninterface{public:virtual~A(){}virtualvoidwhatever_A()=0;};classB//Anotherinterface{public:virtual~B(){}virtualvoidwhatever_B()=0;};然后,我有一个共享库“testc”,它构造C类的对象,实现A和B,然后传递指向它们的A接口(interface)的指针:classC:publicA,publicB{public:C();~