Tag: 内存泄漏

函数内的字符串文字:自动变量还是在堆中分配?

我们在里面使用的字符串文字是自动变量吗? 或者它们是否在堆中分配,我们必须手动释放? 我的情况类似于下面显示的代码,其中我将字符串文字分配给类的私有字段(在代码中标记为ONE),并在稍后的程序中检索它并使用它(标记为TWO)。 我是否将堆栈中的变量分配给ONE中的字段? 代码是否可以引用悬空指针,在这种情况下,因为程序足够小,所以可以工作? 我已编译并运行它,它工作正常,但我在我的实际程序中遇到了一个奇怪的崩溃,我将字符串文字分配给类的字段,我怀疑上面提到的情况。 #include using namespace std; class MemoryLeak { private: char *s; public: MemoryLeak() {} void store() { s = “Storing a string”; // ONE } char *retrieve() { return s; } }; int main() { MemoryLeak *obj = new MemoryLeak(); obj->store(); cout <retrieve() << endl; // TWO delete obj; return […]

用户在linux下按ctrl + c时如何避免内存泄漏?

在我用C和C ++编写的程序中,我将新建一个对象来完成任务,然后删除该对象。 在新对象之后但在删除对象之前的那一刻,如果用户按下ctrl + c来中断进程,那将导致不调用delete并发生内存泄漏。 我该怎么做才能避免这种情况? 此外,如果操作系统回收了内存,那么打开的文件呢? 它们是由操作系统关闭还是我应该手动关闭它们?

gcc能准确捕捉到无用的条件吗?

请检查以下代码: if (foo->bar == NULL); foo->bar = strdup(“Unknown”); 我花了三个小时的最后一部分用Valgrind追捕那个泄漏,当我发现这个假的时候感觉非常愚蠢’;’。 我知道上面的代码是有效的C,但是我希望gcc能够告诉我是否使用条件作为语句。 有没有我可以通过的旗帜,这将有助于在未来发现这种类型的错误? 在我看来,gcc能够知道条件是否无用。 IE : if (1 == 1); code_that_is_always_reached_since_conditional_is_a_statement(); 这些棉绒也没有问题。 Valgrind非常适合找到这些类型的东西..但是泄漏实际上比代码最初分配的位置要晚得多。 任何帮助都表示赞赏,甚至“不,它不会那样做”。 编辑: 哇,谢谢你这么快速的回复! 总结一下,这是您的选择: -Wextra接受了各种各样的东西 – 墙没有,包括空/无用的陈述。 -wempty-body接收无用语句,由-Wextra启用(但可以破坏旧版本的gcc,适用于4.3.x) 有些人可能会发现-Wextra很烦人。 您可能会对不同签名的类型进行比较,但您知道只有在它们相同时才会进行比较。 即 int ret; unsigned int i; ret = foo(bar); /* foo() is known to return a signed errno on failure */ if (ret < […]

免费应用程序检查Windows x64中的内存泄漏?

我的老板已经分配给我检查API的内存泄漏。 应用程序是在C&C ++中创建的。 所以有可能使用malloc和new分配内存。 我想在64位Windows 7中以调试器模式检查Visual Studio 2010中的内存泄漏。任务管理器的问题是它没有显示稳定的读数(内存增加和减少少量)。 在API运行之前和之后,差异也很小。 所以我不能肯定地说每个周期x内存泄漏。 我在网上搜索过,发现linux有一个很棒的工具。 但是我想要一个可靠的工具来满足我的要求(Windows 7)。 我遇到过这些: http://winleak.sourceforge.net/ http://sourceforge.net/projects/duma/?source=recommended 如上所述: 检查Windows中的内存泄漏 工具 http://technet.microsoft.com/en-us/library/bb457063.aspx 对我的要求没用。 如果你能提出一个好的工具,那将是非常有帮助的,因为请求这个的客户对我们公司非常重要。 谢谢!

如何在托管代码环境之外安全编程?

如果您是使用C或C ++编程的人,没有内存管理的托管语言优势,类型检查或缓冲区溢出保护,使用指针算法,您如何确保您的程序是安全的? 你使用了很多unit testing,还是只是一个谨慎的编码器? 你有其他方法吗?

OpenSSL函数EVP_PKEY_keygen中的内存泄漏

我只是尝试使用以下方法生成RSA密钥: #include #include int main(void) { OpenSSL_add_all_algorithms(); EVP_PKEY_CTX *ctx; EVP_PKEY *pkey = NULL; ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); if (!ctx) { // error } if (EVP_PKEY_keygen_init(ctx) <= 0) { // error } if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048) <= 0) { // error } if (EVP_PKEY_keygen(ctx, &pkey) <= 0) { // this call seems to leak // error } […]

当使用gcc-5.2.0编译程序时,为什么valgrind没有发现泄漏

今天我正在编写一些东西,在我完成之后,我与valgrind进行了检查,我得到了一个惊喜。 如果我使用gcc-4.9.2在我的Ubuntu(15.04 64BIT)上编译我的程序,如下所示: gcc -Wextra -Werror -Wstrict-prototypes -Wconversion –std=c11 -O2 -g program.c -o program 然后运行valgrind: valgrind –leak-check=full –track-origins=yes ./program 我得到以下输出: ==5325== Memcheck, a memory error detector ==5325== Copyright (C) 2002-2013, and GNU GPL’d, by Julian Seward et al. ==5325== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info ==5325== Command: ./program ==5325== Bye ==5325== […]

不释放内存是否可以接受

我正在研究一个应该从命令行使用的项目,其语法如下: program-name input-file 该程序应该处理输入,计算一些东西并在stdout上吐出结果。 我选择的语言是C ++,原因有几个我不想辩论。 计算阶段将是高度符号化的(思考编译器)并将使用非常复杂的动态分配数据结构。 特别是,它不适合RAII风格的编程。 我想知道忘记释放内存是否可以接受,因为我希望整个计算消耗的内存少于可用内存,并且程序完成后OS可以在一步中自由回收所有内存(假设程序终止)很快)。 你对此有何看法? 作为备份计划,如果我的项目需要以服务器或交互方式运行,我认为我总是可以将垃圾收集器重新编译为源代码。 有没有人有使用C ++垃圾收集器的经验? 他们运作良好吗?

Valgrind报告在OS X 10.8.1上泄露了内存

我在OS X 10.8.1,Mountain Lion上使用Valgrind版本3.8.0。 关于与10.8.1的兼容性, Valgrind的网站说(italics mine): Valgrind 3.8.0适用于 {x86,amd64} -darwin(Mac OS X 10.6和10.7,支持10.8)。 那么,我知道10.8.1只有“有限的支持”。 尽管如此, 这个错误报告说(斜体矿): 这个(最新的3.8.0版本)使Valgrind编译并能够在OSX 10.8上运行小程序。 但请注意,它仍然使用更大的应用程序断言,并且根本没有正确检查32位程序(Memcheck错过了大多数错误)。 好没关系。 因此,如果气质,Valgrind应该在10.8.1上工作。 所以现在我的问题是: 我能够在没有任何问题的情况下让Valgrind在10.8.1上编译,但是当我在几个小C程序上运行它时,我看到了一些奇怪的结果。 为了尝试减少问题的可能原因,我最终编写了以下“程序”: int main () { return 0; } 我会说,不是很令人兴奋,而且很少有漏洞。 然后,我编译并通过Valgrind运行它: gcc testC.c valgrind ./a.out 这是我的输出: ==45417== Command: ./a.out ==45417== ==45417== WARNING: Support on MacOS 10.8 is experimental and mostly broken. ==45417== […]

openmp是否会分配内存并释放所有内容

openmp是否分配内存并释放所有内存? 因为我跑了valgrind,并且释放了我所有的名单..我在malloc的所有东西,我都自由了。 ==11442== HEAP SUMMARY: ==11442== in use at exit: 192 bytes in 1 blocks ==11442== total heap usage: 2,001 allocs, 2,000 frees, 2,917,280 bytes allocated ==11442== ==11442== LEAK SUMMARY: ==11442== definitely lost: 0 bytes in 0 blocks ==11442== indirectly lost: 0 bytes in 0 blocks ==11442== possibly lost: 0 bytes in 0 blocks ==11442== […]