相关疑难解决方法(0)

理解指针有什么障碍,克服它们可以做些什么?

对于C或C++中的许多新的,甚至是老的大学生来说,为什么指针会成为混乱的主要因素?是否有任何工具或思维过程可以帮助您理解指针在变量,函数和更高级别的工作方式?

有什么好的做法可以让人达到"啊哈,我明白了"的水平,而不会让他们陷入整体概念的困境?基本上,钻取方案.

c c++ pointers

443
推荐指数
16
解决办法
7万
查看次数

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万
查看次数

堆腐败:原因是什么?

我正在调查由于堆损坏导致的崩溃.由于这个问题非常重要并涉及分析堆栈和转储结果,因此我决定对与崩溃相关的文件进行代码审查.

坦率地说,我没有深入了解何时堆可能被破坏.

如果你能提出可能导致堆损坏的情况,我将不胜感激.

平台:Windows XP

语言:C++

编译器:VC6

c++ memory-management

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

为什么我应该在"char bigchar [1u << 31 - 1];"时使用malloc()工作得很好?

在静态数组上使用malloc(除了NULL返回失败)有什么好处?以下程序将占用我所有的ram并且只有在取消注释循环时才开始填充交换.它没有崩溃.

...

#include <stdio.h>

unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];

int main (int argc, char **argv) {
  int i;
/*   for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/*   for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */

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

...

经过一些反复试验后,我发现上面是我的32位Intel机器上允许使用GCC 4.3的最大静态阵列.这是标准限制,编译器限制还是机器限制?显然我可以拥有我想要的那么多.这将是段错误,但只有当我要求(并尝试使用)时,malloc才会给我更多.

有没有办法确定静态数组是否实际分配并且可以安全使用?

编辑:我感兴趣的是为什么malloc用于管理堆而不是让虚拟内存系统处理它.显然,我可以将一个数组的大小调整到我认为我需要的大小的很多倍,并且虚拟内存系统只会保留ram所需的内容.如果我从未写过例如这些巨大数组的结束(或开头)那么程序就不会使用物理内存.此外,如果我可以写入每个位置,那么malloc除了在堆中递增指针或在同一进程中搜索先前的分配外,还做了什么呢?

编者注: 如果int是32位,则1 << …

c arrays malloc static

7
推荐指数
4
解决办法
1397
查看次数

Valgrind或Electric Fence未检测到堆腐败.我应该怀疑吗?(C++)

我最近遇到了堆腐败的第一次战斗 (已解决).在我家的linux机器上,使用valgrind和电栅栏(使用gdb),罪魁祸首代码无错误地退出.然而,在我们实验室的Windows机器上,我始终从我引用的帖子中描述了VS中与堆损坏相关的错误消息.

valgrind和电围栏不会发现这样的问题,这是否令人惊讶(或至少不常见)?其他人提到了一个可能类似的错误,在这里回答了valgrind .这些工具无法检测到此问题的原因可能是什么?有没有理由怀疑错误实际上是堆腐败?

更新:正如在描述原始问题的帖子中所提到的,我发现问题是由于指向std :: vector中的元素指针,这变得很糟糕.用std :: list替换向量(添加新元素时指针不会变为无效)修复了问题.所以回到我关于为什么valgrind没有发现问题的问题,我问是否有关于如何避免将来出现类似情况的建议,即valgrind未检测到的内存问题,这是我的一个问题最喜欢的工具 显然,更好地了解STL如何工作将是一个好主意.也许我需要在编程等方面对断言更加自信.

valgrind memory-corruption visual-studio electric-fence

6
推荐指数
1
解决办法
2081
查看次数

为什么我的C++代码在使用read(...)函数后会导致分段错误?

我的应用程序暂停在一行似乎没有任何问题的代码上,但是我的IDE似乎是在该行上挂起并出现错误:

gdb/mi(24/03/09 13:36)(退出.信号'SIGSEGV'收到.说明:分段错误.)

代码行只调用一个没有代码的方法.当您有空引用时,不是分段错误吗?如果是这样,空方法如何具有空引用?

这段代码似乎导致了这个问题:

#include <sys/socket.h>

#define BUFFER_SIZE 256

char *buffer;

buffer = (char*)GetSomePointer()->SomeStackMemoryString.c_str();
int writeResult = write(socketFD, buffer, BUFFER_SIZE);

bzero(buffer, BUFFER_SIZE);
int readResult = read(socketFD, buffer, BUFFER_SIZE);
Run Code Online (Sandbox Code Playgroud)

当使用该read(...)方法的行被注释掉时,问题就会消失.

更新:

我已将问题改为指向实际问题,并且已删除所有不相关的代码 - 我也回答了我自己的问题,以便阅读此内容的人明确知道问题所在,请在说"你是"之前阅读我的答案一个白痴!"

c c++ memory-leaks segmentation-fault

1
推荐指数
1
解决办法
3827
查看次数