小编Cod*_*ash的帖子

如何在C或C++中反转字符串?

如何在C或C++中反转字符串而不需要单独的缓冲区来保存反向字符串?

c c++ string reverse

170
推荐指数
13
解决办法
31万
查看次数

逗号运算符如何工作

逗号运算符如何在C++中工作?

例如,如果我这样做:

a = b, c;  
Run Code Online (Sandbox Code Playgroud)

最终是否等于b或c?

(是的,我知道这很容易测试 - 只是在这里记录,以便有人快速找到答案.)

更新: 此问题在使用逗号运算符时暴露了细微差别.只是记录下来:

a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!
Run Code Online (Sandbox Code Playgroud)

这个问题实际上是受到代码中的拼写错误的启发.打算做什么

a = b;
c = d;
Run Code Online (Sandbox Code Playgroud)

转换成

a = b,    //  <-  Note comma typo!
c = d;
Run Code Online (Sandbox Code Playgroud)

c++ comma-operator

165
推荐指数
6
解决办法
5万
查看次数

C++中的Unicode处理

在C++中进行Unicode处理的最佳实践是什么?

c++ unicode

103
推荐指数
4
解决办法
4万
查看次数

在C++中使用按位运算符进行布尔运算

是否有任何理由不在C++中对"bool"值使用按位运算符&,|和^?

我有时会遇到两个条件中只有一个是真的(XOR)的情况,所以我只是将^运算符抛出到条件表达式中.我有时也希望评估条件的所有部分是否结果是真的(而不是短路),所以我使用&和|.我有时也需要累积布尔值,而且&=和| =非常有用.

这样做时我已经有了一些眉毛,但代码仍然比其他方面更有意义和更清洁.是否有任何理由不将这些用于布尔?是否有任何现代编译器会给出不好的结果?

c++ boolean bitwise-operators

71
推荐指数
5
解决办法
5万
查看次数

垃圾收集C++中的库

什么免费和商业垃圾收集库可用于C++,每个库的优缺点是什么?

我对来自该领域实际使用的来之不易的教训感兴趣,而不是营销或宣传模糊.

没有必要详细说明与自动垃圾收集相关的常规权衡,但请提及所使用的算法(引用计数,标记和扫描,增量等)并简要总结后果.

c++ garbage-collection libraries

65
推荐指数
4
解决办法
2万
查看次数

具有32位整数的低冲突率的快速字符串哈希算法

我有许多不相关的命名事物,我想快速搜索."aardvark"在任何地方始终都是"aardvark",因此对字符串进行散列并重用整数可以很好地加速比较.整个名称集是未知的(并随着时间的推移而变化).什么是快速字符串哈希算法,它将生成小(32或16)位值并具有低冲突率?

我想看一个特定于C/C++的优化实现.

c++ string algorithm hash

65
推荐指数
6
解决办法
8万
查看次数

Win32下的堆损坏; 如何定位?

我正在研究破坏堆的多线程 C++应用程序.找到这种腐败的常用工具似乎不适用.源代码的旧版本(18个月之前)表现出与最新版本相同的行为,因此这已经存在了很长时间并且没有被注意到; 在缺点方面,源增量不能用于识别何时引入错误 - 存储库中存在大量代码更改.

崩溃行为的提示是在这个系统中产生吞吐量 - 数据的套接字传输,它被导入内部表示.我有一组测试数据会定期导致应用程序异常(各种地方,各种原因 - 包括堆分配失败,因此:堆损坏).

行为似乎与CPU功率或内存带宽有关; 机器越多,崩溃就越容易.禁用超线程核心或双核核心可降低(但不消除)损坏的速度.这表明与时间相关的问题.

现在这里有一个问题:
当它在一个轻量级的调试环境下运行时(比方说Visual Studio 98 / AKA MSVC6),堆损坏相当容易重现 - 在事情失败和异常失败之前经过十或十五分钟,就像alloc;在复杂的调试环境下运行时一样(Rational Purify,VS2008/MSVC9或者甚至是微软应用程序验证程序)系统变得内存速度受限并且不会崩溃(内存限制:CPU没有达到上面50%,磁盘指示灯不亮,程序运行速度快,盒子消耗1.3G2G RAM) .因此,我可以选择能够重现问题(但不能确定原因)或能够识别原因或我无法重现的问题.

我目前最好的猜测是下一步是:

  1. 得到一个疯狂的grunty框(以取代当前的开发框:2Gb RAM E6550 Core2 Duo); 这样可以在强大的调试环境下运行时重现崩溃导致错误行为; 要么
  2. 重写操作符newdelete使用VirtualAllocVirtualProtect在完成后将内存标记为只读.运行MSVC6并让操作系统捕获正在写入释放内存的坏人.是的,这是绝望的标志:谁是地狱重写newdelete?!我想知道这是否会使它像Purify等人一样慢.

而且,不是:内置Purify仪器的运输不是一种选择.

一位同事刚刚走过去问"Stack Overflow?我们现在收到堆栈溢出了吗?!?"

现在,问题是:我如何找到堆腐败者?


更新:平衡new[],delete[]似乎已经有很长的路要走解决问题.而不是15分钟,应用程序现在大约两个小时崩溃.还没有.还有什么建议?堆损坏仍然存在.

更新:Visual Studio 2008下的发布版本似乎要好得多; 目前的怀疑依赖于STL随船携带的实施VS98. …

c++ memory windows debugging multithreading

59
推荐指数
4
解决办法
4万
查看次数

最佳地从system()命令捕获stdout

我正试图通过system()- 例如,启动外部应用程序system("ls").我希望捕获它的输出,因此我可以将它发送到另一个函数进行进一步处理.在C/C++中最好的方法是什么?

c c++ stdout system

52
推荐指数
4
解决办法
8万
查看次数

是否可以以便携方式使用新的数组放置?

在将它用于数组时,是否可以在便携式代码中实际使用新的放置?

看来你从new []返回的指针并不总是和你传入的地址相同(5.3.4,标准中的注释12似乎证实这是正确的),但是我不知道你是怎么回事如果是这种情况,可以为数组分配一个缓冲区.

以下示例显示了该问题.使用Visual Studio编译,此示例导致内存损坏:

#include <new>
#include <stdio.h>

class A
{
    public:

    A() : data(0) {}
    virtual ~A() {}
    int data;
};

int main()
{
    const int NUMELEMENTS=20;

    char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
    A *pA = new(pBuffer) A[NUMELEMENTS];

    // With VC++, pA will be four bytes higher than pBuffer
    printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);

    // Debug runtime will assert here due to heap corruption
    delete[] pBuffer;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

查看内存,编译器似乎使用缓冲区的前四个字节来存储其中项目数的计数.这意味着因为缓冲区sizeof(A)*NUMELEMENTS很大,所以数组中的最后一个元素被写入未分配的堆中.

所以问题是你能找到你的实现需要多少额外的开销来安全地使用placement new []吗?理想情况下,我需要一种可在不同编译器之间移植的技术.请注意,至少在VC的情况下,不同类的开销似乎不同.例如,如果我删除示例中的虚拟析构函数,则new []返回的地址与我传入的地址相同.

c++ arrays compiler-construction portability overhead

36
推荐指数
2
解决办法
1万
查看次数

提升C++开源项目的依赖性?

升压意味着是标准的非标准C++库,每一个C++用户可以使用.假设它可用于开源C++项目是否合理,或者它是一个很大的依赖?

c++ boost standard-library

29
推荐指数
3
解决办法
6404
查看次数