草庐IT

行为不当

全部标签

c++ - 无法解释编译器的行为

考虑这个简单的代码:classA{public:intvalue;A(intvalue){this->value=value;}~A(){printf("destroying%d\n",value);}Aoperator++(){returnA(value+1);}};intmain(){Aa(1);printf("beforeincrement:%d\n",a.value);a=++a;printf("afterincrement:%d\n",a.value);return0;}这个输出:beforeincrement:1destroying2afterincrement:2dest

c++ - 为多平台编译时围绕未定义行为的混淆

我最近发现在C++中以两个下划线开头的任何内容都是未定义的行为。所以我一直在修复我所有的include守卫。但是我遇到过这样的代码#ifdef__WINDOWS___#endif#ifdef__GNUC__#endif但是不是在Windows编译器UB上使用__GNUC__,反之亦然吗?我应该在这里做什么? 最佳答案 你对规则有点误解。您可以使用您的工具链已经(或未)#DEFINEd的东西,即使以两个下划线开头。您自己#DEFINE以两个下划线开头的内容肯定不好。这是一个有用的约定;这意味着您的源代码不能与您的编译器实现C++标准的

c++ - ROS AsyncSpinner 的多线程行为

我试图了解ROS中的AsyncSpinner是如何工作的,因为我可能误解了一些东西。大家可以找一个类似的问题here.如图所示here它的定义提到:Asynchronousspinner:spawnsacoupleofthreads(configurable)thatwillexecutecallbacksinparallelwhilenotblockingthethreadthatcalledit.Thestart/stopmethodallowstocontrolwhenthecallbacksstartbeingprocessedandwhenitshouldstop.而在官方文

c++ - static_cast 和 dynamic_cast 在特定场景中的不同行为

在下面的场景中,我没有弄清楚static_cast和dynamic_cast之间的真正区别:**///withstatic_cast///**classFoo{};classBar:publicFoo{public:voidfunc(){return;}};intmain(intargc,char**argv){Foo*f=newFoo;Bar*b=static_cast(f);b->func();return0;}Output:SuccessfullyBuildandCompiled!**///withdynamic_cast///**classFoo{};classBar:publ

c++ - 使用自定义行为实现字符串类

在我们的一个类(class)中,先生说模板允许一个人自定义类的行为,然后他给出了字符串类的例子,用几行代码我们可以从STL中自定义字符串类,就像我们可以做到的那样将'a'和'z'相同,'b'和'y'相同,'c'和'x'相同,依此类推。类似的'A'和'Z'相同等。"abc"=="zyx"为真;"abc"=="zyx"为假;"abc=="Zyx"为真;等等我正在考虑实现这样的字符串类,但我做不到。我们如何使用模板实现这样的字符串类? 最佳答案 这很棘手。您只需要编写自己的traits类,特别是您需要从char_traits派生它。类模板

c++ - 在这种情况下 unique_ptr 的行为应该是什么?

假设我有以下内容:std::unique_ptrpA;pA(newA);在这个复杂的例子中,pA(newA);的行为应该是怎样的?是吗?据我所知,在MSVC2010中,voidoperator()(T*)const;在new之后立即调用fromdefault_delete立即返回并删除指针。而g++(4.7.0)给了我nomatchforcall(std::unique_ptr)(A*)错误。 最佳答案 代码不应编译。std::unique_ptr不会重载operator()。VisualC++2011DeveloperPrevie

c++ - 奇怪的行为

我遇到了ofstream的一个奇怪行为,“对我来说最不奇怪”。这是我的程序,我使用的是VisualStudio2010ExpressEdition。intmain(){std::ofstreamfile("file.txt");file这会产生正确的输出。something1something2现在,如果我用以下代码替换第9行,file.open("file.txt",std::ios::ate);我得到了这个输出。something2但是如果我再次替换第9行,这次用这段代码,file.open("file.txt",std::ios::ate|std::ios::in);我得到了这个

c++ - 在 C++ 中,返回从本地 char 数组创建的字符串会导致内存泄漏或未定义的行为吗?

我想知道这是否会导致C++中的内存泄漏或未定义的结果?stringfoo(){chartempArray[30];strcpy(tempArray,"Thisisatest");returnstring(tempArray);}我知道这在C中是一件坏事,但我还没有找到C++的明确答案。所以每个人都在说不,但我仍然对何时释放内存感到困惑?假设我有调用上述方法的方法voidbar(){stringtestString=foo();}在上面的代码中,从foo()返回的字符串对象在什么时候调用了它的析构函数?是在复制到对象testString后立即执行的吗? 最佳答

c++ - 是在索引一个新的 map 元素并将读取它的东西分配给它未定义的行为,还是只是未指定的?

回答后thisquestion,关于所讨论的代码是否为未定义行为的问题进行了长时间的讨论。这是代码:std::mapword_count;word_count["a"]=word_count.count("a")==0?1:2;首先,众所周知,这至少是未指定的。结果因首先评估作业的哪一侧而异。在我的回答中,我遵循了四个结果案例中的每一个,首先评估哪一方的因素以及该元素是否在此之前存在。还有一个简短的表格出现了:(x=0)=(x==0)?1:2;//startedas(x=0)=(y=="a")?1:2;//changedto我声称它更像这样:(x=0,x)=(x==0)?1:2;//c

c++ - "Static counter"类型行为异常

我正在开发一个基于实体的组件系统,我正在尝试为组件类型分配某个索引:staticstd::size_tgetNextTypeId(){staticstd::size_tlastTypeIdBitIdx{0};++lastTypeIdBitIdx;//Thislineproducestheoutputattheendofthequestionstd::cout::bitIdxwillalwaysbedifferent//fromTypeIdStorage::bitIdxtemplatestructTypeIdStorage{staticconststd::size_tbitIdx;};/