草庐IT

c++ - 这是使用访问功能的好习惯

我有以下代码,我也想在使用GCC4.8的Linux上工作这是使用VS2013if(_access(trigger->c_str(),0)!=-1){...}我知道在Linux上我可以使用function:accessfrom"unistd.h"有没有办法避免出现类似下面的情况(更优雅的解决方案)?#ifdef__linux__#include#endif#ifdef__linux__if(access(trigger->c_str(),0)!=-1){...}#elseif(_access(trigger->c_str(),0)!=-1){...}#endif

c++ - 这是一个很好的 std::auto_ptr<> 用例吗?

请假设我有一个接受指针作为参数的函数。这个函数可以抛出异常,因为它使用std::vector::push_back()管理此指针的生命周期。如果我这样声明:voidmanage(T*ptr);并这样称呼它:manage(newT());如果它抛出异常将指针插入std::vector,我实际上有内存泄漏,不是吗?会像这样声明函数:voidmanage(std::auto_ptrptr);解决我的问题?我希望它首先分配std::auto_ptr在堆栈上(我猜永远不会抛出异常的东西)并让它获得对指针的所有权。安全的。然后,在函数内部,我将原始指针插入std::vector,这也是安全的:如果

c++ - 对 STL 字符串使用 fread/fwrite。这是正确的吗?

我有一个包含字符串的结构。类似的东西:结构block{诠释;字符串b;诠释c;};所以,我想,我不能使用fread和fwrite函数从文件中写入和读取这个结构。因为字符串可能保留不同的内存容量。但是这样的代码可以正常工作。block变量;​​fwrite(&var,sizeof(Chunk),1,文件);fread(&var,sizeof(Chunk),1,文件);真的有问题吗? 最佳答案 你有理由怀疑这一点。您应该只流式传输具有fwrite和fread的POD类型,并且string不是POD。

c++ - 这是指向指针的指针吗?

考虑以下结构声明:typedefstruct{UINT8HdrLength:4;UINT8Version:4;UINT8TOS;UINT16Length;UINT16Id;UINT16FragOff0;UINT8TTL;UINT8Protocol;UINT16Checksum;UINT32SrcAddr;UINT32DstAddr;}WINDIVERT_IPHDR,*PWINDIVERT_IPHDR;最后声明的“*PWINDIVERT_IPHDR”,我以前从未见过。它似乎只是WINDIVERT_IPHDR结构的指针类型声明。我的假设正确吗?如果是,这段代码会不会:externBOOLW

c++ - 非虚拟析构函数的未定义行为 - 这是一个现实世界的问题吗?

考虑以下代码:classA{public:A(){}~A(){}};classB:publicA{B(){}~B(){}};A*b=newB;deleteb;//undefinedbehaviour我的理解是,C++标准规定删除b是未定义的行为-即,任何事情都可能发生。但是,在现实世界中,我的经验是~A()总是被调用,并且内存被正确释放。如果B引入任何具有自己的析构函数的类成员,它们将不会被调用,但我只对上面的简单情况感兴趣,其中使用继承可能会修复一个类方法中的错误源代码不可用。显然,这不会是您在非平凡情况下想要的,但它至少是一致的。对于显示的代码,您是否知道任何C++实现都不会发生上

c++ - 这是对 intrusive_ptr 的有效使用吗?

在我的代码中,当涉及到intrusive_ptrs时,我遵循两条规则:按值传递原始指针意味着保证原始指针在该函数的生命周期内有效。如果要在函数的生命周期之外存储和使用原始指针,则应将其存储在intrusive_ptr中。许多Internet评论者写道,shared_ptr应该比intrusive_ptr更受欢迎,除非使用第三方代码。但是,intrusive_ptr避免了传递智能指针,因为您可以从原始指针创建intrusive_ptr,就像在函数生命周期之外需要对象时一样。我只是担心我遗漏了一些东西,因为我读过的任何东西都没有说明有关intrusive_ptrs的观​​点,而且大多数人似

c++ - 这是 MSVC++ 2017 更新 3 中的编译器错误吗

#includestd::vector::iteratorfoo();voidbar(void*){}intmain(){void*p;while(foo()!=foo()&&(p=0,true)){bar(p);}return0;}错误结果:c:\users\jessepepper\source\repos\testcode\consoleapplication1\consoleapplication1.cpp(15):errorC4703:potentiallyuninitializedlocalpointervariable'p'used 最佳答案

c++ - 这是正确的 : virtual method of Derived called before constructing Base object?

我知道在Base类的构造函数中-当调用虚拟方法时-调用Base方法,而不是派生-参见Callingvirtualfunctionsinsideconstructors.我的问题与这个主题有关。我只是想知道如果我在Derived类构造函数中调用虚拟方法会发生什么-但在构造Base部分之前。我的意思是调用虚方法来评估基类构造函数参数,请参见代码:classBase{public:Base(constchar*name):name(name){cout编译器g++(4.3.x-4.5x版本)输出为:Derived::getName()Base():DerivedDerived():Deriv

c++ - 我不认为这是类型转换,但它是什么?

这包含在一个for循环中:v[i]=new(&vv[i])vertex(pts[i],i);vertex是一个structpts是一个point*v是一个vertex**vv是一个vertex*(&vv[i])部分是做什么的? 最佳答案 看起来像是新的展示位置。它与普通的new语句相同,但它不是实际分配内存,而是使用括号内的表达式指向的已经可用的内存。在你的例子中,它使用vv[i]中的内存来创建新的vertex对象,然后返回指向该对象的指针(即&vv[i])并将其分配给v[i]。参见例如thisreference了解更多详情。

c++ - 这是 C++ 中有效的数据结构 Map<string, string, string> 吗?

我必须为每个变量存储3个字符串,但不知道在C++中哪个是最好的数据结构。我只能想到Struct,但不确定这是否是最好的方法。类似于stringvar[100][3],第一维(100)应该动态添加和删除。我用map、多map尝试了各种各样的事情。感谢任何帮助。谢谢 最佳答案 如果您总是将恰好3个字符串放在一个三元组中,并且想要有多个三元组,则定义具有三个字符串的结构并将其放入std::vector。structTriplet{std::stringa,b,c;};std::vectordata;