草庐IT

野指针

全部标签

c++ - 奇怪的行为,用 int 初始化函数指针?

无意中,我发现这段代码可以在VS2012上编译。typedefvoid(*func)();funcf=func(12);f被初始化为一个整数12作为它的地址。据我所知,从整数转换为函数指针是有效的,如下所示:funcf=(func)12;虽然语句func(12)看起来更像是一个构造函数,所以我尝试了这个:funcf(12);编译失败。funcf=(func)12//ok,cast1funcf=func(12);//ok,what?2funcf(12);//failed3funcf=12;//failed4所以我的问题是:func(12)的真正底层语法是什么,是强制转换还是初始化?如何使

c++ - 成员函数返回指向成员函数的指针

我想要一个带有成员函数的类,该类返回指向成员函数的指针。也就是说,类似于:classFoo{//typedef????(Foo::*func)????public:Funcs1();Funcs2();Funcs3();}FuncFoo::s1(){//dostuffreturn&Foo::s2;}FuncFoo::s2(){//dostuffreturn&Foo::s3;}FuncFoo::s3(){//dostuffreturn0;}基本上,我尝试做的是实现一个状态机,其中每个状态现在都是下一个状态并通过函数指针返回它。注意:我对其他实现状态机的方法不感兴趣。我真的很想知道它是否可以

c++ - boost::function 与函数指针

我正在实现一个通用设置读取器。我的想法是我有一个应用程序,它的设置可以是bool值、整数和字符串。然后我有一个Config类,其中实现了此类设置的getter,配置类在构造函数中接受了一个客户,因此它知道它将读取该客户的设置。我在让它工作时遇到了麻烦,我想我误用了boost::function,将它与普通函数指针混淆了。在映射中,我希望有引用,而boost::function应该只在配置读取时绑定(bind),因为我已经为那里分配了一个Config实例给定的客户。问题是我不能在没有typedef的情况下使用函数指针,这会使模板工作复杂化,有什么更明智的解决方案吗?#include"Co

c++ - 如何获得指向虚拟成员函数的 "direct"函数指针?

我在一个嵌入式平台上工作,该平台不能很好地处理动态代码(根本没有推测/OOO执行)。在这个平台上,我经常在同一个对象上调用虚拟成员函数,但是编译器无法优化vtable-lookup,因为它似乎没有识别出仅在第一次调用时才需要查找。因此我想知道:是否有一种手动方法可以将C++类的虚拟成员函数去虚拟化,以获得直接指向已解析地址的函数指针?我查看了C++函数指针,但由于它们似乎需要指定类型,我想这不会成功。提前致谢 最佳答案 没有通用的仅标准C++方法来查找虚函数的地址,仅给出对基类对象的引用。此外,没有合理的type,因为this不需要

c++ - 如何检查函数指针是否存在

在C++中,我试图编写一个带有函数指针的函数。如果为不存在的函数传递函数指针,我希望能够抛出异常。我尝试像处理普通指针一样处理函数指针并检查它是否为空#include#includeusingnamespacestd;intadd_1(constint&x){returnx+1;}intfoo(constint&x,int(*funcPtr)(constint&x)){if(funcPtr!=NULL){returnfuncPtr(x);}else{throw"notavalidfunctionpointer";}}intmain(intargc,char**argv){try{int

c++ - 如何使用带有函数指针的新 QObject::connect 语法将 QSslSocket::error 信号连接到插槽?

我正在尝试编译这段代码。标题:#ifndefSOCKETTEST_H#defineSOCKETTEST_H#include#includeclassSocketTest:publicQObject{Q_OBJECTpublic:explicitSocketTest(QObject*parent=0);signals:publicslots:voidonError(QAbstractSocket::SocketErrorsocketError);};#endif//SOCKETTEST_H来源:#include"sockettest.h"SocketTest::SocketTest(QO

c++ - 使用指向自身的指针初始化成员变量

我听说以下是有效的并且未初始化x就好像它是intx;:intx=x;这个呢?这段代码是否等同于上面的:structFoo{Foo(intFoo::*p):x(this->*p){}intx;};intmain(){Foof(&Foo::x);}f.x是否仍未初始化?我有未定义的行为吗? 最佳答案 C++14清楚地表明使用indeterminatevalueisundefinedbehavior,来自8.5部分(强调我的):Ifnoinitializerisspecifiedforanobject,theobjectisdefault

c++ - 检查函数指针是否被注册

上下文(C++11)作为一段序列化代码中安全措施的一部分,我想检查函数指针是否已知。(否则,反序列化机制可能会失败)。这是一段(简化的)代码,说明了该机制:templatestructFunctionCallRegistry{staticstd::unordered_map&FunctionMap(){staticstd::unordered_mapmap;returnmap;}staticvoidRegister(Funfunction,std::stringname){auto&map=FunctionMap();autoit=map.find(function);if(it==m

c++ - 标记为可能丢失 block 的静态指针是否损坏?

在阅读了有关Valgrind的“可能丢失”block消息后,它们似乎很糟糕。我收到静态指针类成员的错误。我想验证我们的代码没有任何问题。我从Valgrind得到这个:==27986==76bytesin1blocksarepossiblylostinlossrecord370of1,143==27986==at0x4C247F0:operatornew(unsignedlong)(vg_replace_malloc.c:319)==27986==by0x107CFEE8:std::string::_Rep::_S_create(unsignedlong,unsignedlong,std

c++ - 为什么要在函数指针或返回函数指针的函数编译之前放几十个*?

我发现这段处理多个函数指针取消引用的代码意外编译,尽管看起来无效。这怎么能编译?它是编译器中的错误吗?我在Ubuntu14.04上使用gcc4.8.2。intaddInt(intn,intm)//function{returnn+m;}int(*(*functionFactoryPtr)(intn))(int,int);//pointerint(*(functionFactory)(intn))(int,int)//function{std::cout 最佳答案 函数左值可以隐式转换为指向函数的指针([conv.func])。在您的