Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

12
C ++元组与结构
使用astd::tuple和仅数据之间有什么区别struct吗? typedef std::tuple<int, double, bool> foo_t; struct bar_t { int id; double value; bool dirty; } 从网上发现的地方,我发现有两个主要区别:struct更具可读性,而则tuple具有许多可以使用的通用功能。是否应该有明显的性能差异?此外,数据布局是否彼此兼容(可互换转换)?
95 c++  struct  tuples 

4
显式模板实例化-什么时候使用?
休息几周后,我试图用David Vandevoorde和Nicolai M. Josuttis撰写的“模板-完整指南”一书来扩展和扩展模板的知识,而现在我想了解的是模板的显式实例化。 我实际上没有这种机制的问题,但是我无法想象我想要或想要使用此功能的情况。如果有人可以向我解释,我将不胜感激。
95 c++  templates 


6
修复C ++中的分段错误
我正在为Windows和Unix编写跨平台的C ++程序。在窗口方面,代码将编译并执行没有问题。在Unix方面,它将编译,但是当我尝试运行它时,出现了分段错误。我最初的预感是指针存在问题。 有什么好的方法来查找和修复分段错误?

2
在C ++ 20之前将malloc用于int未定义行为
有人告诉我,以下代码在C ++ 20之前具有未定义的行为: int *p = (int*)malloc(sizeof(int)); *p = 10; 真的吗? 该论点是int对象的生存期在分配值之前没有开始(P0593R6)。若要解决此问题,new应使用放置: int *p = (int*)malloc(sizeof(int)); new (p) int; *p = 10; 我们真的必须调用一个琐碎的默认构造函数来启动对象的生存期吗? 同时,该代码在纯C语言中没有未定义的行为。但是,如果我int在C代码中分配一个并在C ++代码中使用它会怎样? // C source code: int *alloc_int(void) { int *p = (int*)malloc(sizeof(int)); *p = 10; return p; } // C++ source code: extern "C" int *alloc_int(void); …

8
如何追踪“双重释放或腐败”错误
当我运行(C ++)程序时,它因该错误而崩溃。 *检测到glibc * ./load:两次释放或损坏(!prev):0x0000000000c6ed50 *** 如何追踪错误? 我尝试使用print(std::cout)语句,但未成功。可以gdb简化这个过程?
95 c++  c  debugging  free 

2
“ C ++编程语言”第4版第36.3.6节中的代码是否具有明确的行为?
在Bjarne Stroustrup的C ++编程语言第4版第36.3.6 STL类操作中,以下代码用作链接的示例: void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ), 4, "only" ) .replace( s.find( " don't" ), 6, "" ); assert( s == "I have heard it works …

2
在C ++中使用Boost生成UUID的示例
我只想生成随机的UUID,因为对于程序中的实例来说,拥有唯一的标识符非常重要。我研究了Boost UUID,但是由于无法理解要使用哪个类和方法,因此无法生成UUID。 如果有人可以给我任何实现此目标的示例,我将不胜感激。
94 c++  boost  uuid  boost-uuid 

7
是否可以区分0和-0?
我知道整数值0和-0基本上是相同的。但是,我想知道是否可以区分它们。 例如,如何知道是否分配了变量-0? bool IsNegative(int num) { // How ? } int num = -0; int additinon = 5; num += (IsNegative(num)) ? -addition : addition; -0保存在内存中的值是否与完全相同0?

8
如果找不到搜索结果,则返回“ NULL”对象
我对C ++相当陌生,因此在学习时,我倾向于使用许多Java风格进行设计。无论如何,在Java中,如果我有一个带有“搜索”方法的类,该类T将从Collection< T >与特定参数匹配的对象中返回一个对象,则将返回该对象,如果在集合中未找到该对象,则将返回null。然后在我的调用函数中,我只是检查if(tResult != null) { ... } 在C ++中,我发现null如果对象不存在,则无法返回值。我只想返回类型T的“指示器”,通知调用函数没有找到对象。我不想抛出异常,因为这并不是真正的例外情况。 这是我的代码现在的样子: class Node { Attr& getAttribute(const string& attribute_name) const { //search collection //if found at i return attributes[i]; //if not found return NULL; // what should this be? } private: vector<Attr> attributes; } 我该如何更改它才能给出这种标记?

2
如何通过引用或值返回智能指针(shared_ptr)?
假设我有一个带有返回a的方法的类shared_ptr。 通过引用或按值退还它可能有什么利弊? 两种可能的线索: 早期物体破坏。如果我返回shared_ptrby(const)引用,则引用计数器不会增加,因此当对象超出另一个上下文(例如,另一个线程)的范围时,我将承担删除该对象的风险。这样对吗?如果环境是单线程的,该情况也会发生吗? 成本。价值传递当然不是免费的。是否有可能在任何可能的情况下避免它? 谢谢大家。

10
如何在C ++类的内存结构中创建一个“空格”?
问题 在低级别的裸机嵌入式环境中,我想在内存中以C ++结构创建一个空白且没有任何名称的名称,以禁止用户访问此类内存位置。 现在,我通过放置一个丑陋的uint32_t :96;位域(可以方便地代替三个词)来实现它,但是它会引起GCC的警告(位域太大,无法容纳在uint32_t中),这是非常合理的。 虽然可以正常工作,但是当您要分发包含数百种警告的库时,它并不是很干净。 我该怎么做呢? 为什么首先存在问题? 我正在从事的项目包括定义整个微控制器系列(STMicroelectronics STM32)的不同外设的存储器结构。为此,结果是一个类,其中包含多个结构的联合,这些结构定义了所有寄存器,具体取决于目标微控制器。 下面是一个非常简单的外设的简单示例:通用输入/输出(GPIO) union { struct { GPIO_MAP0_MODER; GPIO_MAP0_OTYPER; GPIO_MAP0_OSPEEDR; GPIO_MAP0_PUPDR; GPIO_MAP0_IDR; GPIO_MAP0_ODR; GPIO_MAP0_BSRR; GPIO_MAP0_LCKR; GPIO_MAP0_AFR; GPIO_MAP0_BRR; GPIO_MAP0_ASCR; }; struct { GPIO_MAP1_CRL; GPIO_MAP1_CRH; GPIO_MAP1_IDR; GPIO_MAP1_ODR; GPIO_MAP1_BSRR; GPIO_MAP1_BRR; GPIO_MAP1_LCKR; uint32_t :32; GPIO_MAP1_AFRL; GPIO_MAP1_AFRH; uint32_t :64; }; struct { uint32_t :192; GPIO_MAP2_BSRRL; GPIO_MAP2_BSRRH; uint32_t …


2
JPEG的Death漏洞如何运作?
我一直在阅读有关Windows XP和Windows Server 2003上针对GDI +的较旧漏洞利用的信息,称其为我正在从事的项目的JPEG死亡。 该漏洞在以下链接中有很好的解释:http : //www.infosecwriters.com/text_resources/pdf/JPEG.pdf 基本上,JPEG文件包含一个称为COM的节,其中包含一个(可能为空)注释字段,以及一个两个字节的值,其中包含COM的大小。如果没有注释,则大小为2。读取器(GDI +)读取大小,将其减去2,然后分配适当大小的缓冲区以将注释复制到堆中。攻击涉及0在字段中放置值。GDI +减去2,导致一个值-2 (0xFFFe),其被转化成无符号整数0XFFFFFFFE的memcpy。 样例代码: unsigned int size; size = len - 2; char *comment = (char *)malloc(size + 1); memcpy(comment, src, size); 观察到malloc(0)第三行应该返回一个指向堆上未分配内存的指针。如何写入0XFFFFFFFE字节(4GB!!!!)可能不会使程序崩溃?这是否会超出堆区域并写入其他程序和OS的空间?那会发生什么呢? 据我了解memcpy,它只是将n字符从目标复制到源。在这种情况下,源应该在堆栈上,目标应该在堆上,并且n是4GB。
94 c++  security  memcpy  malware 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.