Tag: 内存泄漏

内存泄漏调试

如果没有跟踪工具,有哪些检测/调试内存泄漏的技术?

为什么电栅栏/ Valgrind无法捕获这个缓冲区溢出问题?

我创建了一个错误的程序 – buggy.c – 这是缓冲区t的缓冲区溢出方案。 您可以看到我正在编写超过5个索引。 它工作正常。 它永远不会给我一个错误。 我在想,为什么会那样? 我甚至试过Valgrind,这也找不到这个问题。 你能告诉我这里有什么问题吗? void buffer_overflow(void) { int t[5]; int i = 0; for(i = 0; i<=7; i++) { t[i] = i; } /** this will cause buffer overflow **/ printf("Memory_overflow_completed\r\n"); } int main(int argc, char **argv) { buffer_overflow(); return 0; } $gcc -g buggy.c -o buggy.out -lefence […]

释放内存两次

在C和C ++中,释放NULL指针将导致无法完成任务。 不过,我看到有人说如果你“两次释放内存”会导致内存损坏。 这是真的? 当你释放记忆两次时,引擎盖下发生了什么?

realloc()泄漏内存

我有一个函数,它为字符串添加一个字符: void AddChToString(char **str,char ch){ int len=(*str)?strlen(*str):0; (*str)=realloc(*str, len+2); (*str)[len]=ch; (*str)[len+1]=’\0′; } 仪器(在mac上)和Valgrind表示行:(* str)= realloc(* str,len + 2)是泄漏内存。 这是realloc的实现问题吗? 或者我使用不当? 这是Valgrind的输出: ==39230== 6 bytes in 1 blocks are definitely lost in loss record 1 of 7 ==39230== at 0x100018B2D: realloc (vg_replace_malloc.c:525) ==39230== by 0x100002259: AddChToString (in ./OpenOtter) ==39230== by 0x10000477B: QueryMapFromString (in ./OpenOtter) ==39230== by […]

当我们用c中的字符串文字初始化一个char数组时,是否会发生垃圾收集?

当我们在C中编写以下代码行时, char local_arr[] = “I am here”; 文字“我在这里”被存储在内存的只读部分(比如RM )。 我如何想象它是如何在RM中连续存储的(是吗?)。 然后,数组local_arr (即本地数组)通过索引从RM中的位置复制此数组索引。 但是在local_array复制之后,文字会发生什么? 它是否丢失从而导致内存泄漏? 或者是否有类似Java的垃圾收集器来清理未引用的对象? 例如,如果我写一段代码如下: for(int i=0;i<100000;i++) char local[] = "I am wasting memory"; 我不会用完记忆吗? 每次迭代都会在每次迭代时创建相同文字的新实例吗? 或者他们都会引用相同的文字,因为每次文字的价值是相同的? RM是属于堆内存还是堆中的专用段? 本地数组也存储在堆栈中,对吧? 如果我使用动态数组或全局数组怎么办? 那么会发生什么?

pthread_create内存泄漏?

每当我在我的程序上运行valgrind时,它告诉我,无论我在哪里调用pthread_create,我都可能丢失内存。 我一直在努力遵循指导 使用pthread_create时valgrind内存泄漏错误 http://gelorakan.wordpress.com/2007/11/26/pthead_create-valgrind-memory-leak-solved/ 和谷歌给我的其他各种网站,但没有任何效果。 到目前为止,我已尝试加入线程,将pthread_attr_t设置为DETACHED,在每个线程上调用pthread_detach,并调用pthread_exit()。 尝试PTHREAD_CREATE_DETACHED – pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this); pthread_create(&drive, &attr, driving_thread, (void*)this); pthread_create(&update, &attr, update_server_thread(void*)this); 我想我可能已经编写了下一个加入错误的代码…我将通过https://computing.llnl.gov/tutorials/pthreads/进行编码,他们将所有线程都放在一个数组中,这样它们只是用于循环。 但我没有将它们全部放在一个数组中,所以我试着将它改成工作。 请告诉我,如果我做错了。 void* status; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); pthread_create(&c_udp_comm, &attr, udp_comm_thread, (void*)this); pthread_create(&drive, &attr, driving_thread, (void*)this); pthread_create(&update, &attr, update_server_thread(void*)this); pthread_join(c_udp_comm, &status); pthread_join(drive, &status); pthread_join(update, &status); 尝试pthread_detach – pthread_create(&c_udp_comm, NULL, […]

内存/速度问题的一般策略

我有一个c ++代码,它运行大约200个ASCII文件,进行一些基本的数据处理,并输出一个带有(基本上)所有数据的ASCII文件。 该程序一开始运行得非常快,然后在一段时间内急剧减速,可能会逐渐减慢,然后以相当缓慢的速度进行。 即它在大约5秒钟内通过前~80个文件,在大约50秒内完成约200个文件。 每个文件基本相同。 我正在寻找有关如何追踪问题或内存泄漏的建议。 更多细节:首先我会在程序开头fopen(FILE * outputFile,“w”),最后是fclose()。 前~40个文件大约需要4秒钟; 然后大约1.5分钟~200个文件。 我想也许输出文件堵塞了内存,所以我在每次迭代时(即每次打开一个新文件时)将代码更改为fopen(outputFile,“a”),每次关闭输入文件时fclose()。如上所述,这将性能提高到约50秒。 看起来很奇怪,这个“修复”会有明显的帮助,但并非完全如此。 此外,我不是动态分配任何内存(没有调用’新’或’删除’或’免费’或其他什么)….所以我甚至不知道我怎么会有内存泄漏。 任何帮助,将不胜感激! 谢谢! 码: vector dirCon; // Uses boost::filesystem to store every file in directory bool retVal = FileSystem::getDirectoryContents(HOME_DIR+HISTORY_DIR, &dirCon, 2); int counter = 0; for(int i = 0; i < dirCon.size(); i++) { // Create output file FILE *outFile; string outputFileName […]

cJSON内存泄漏

我在程序中使用cJSON将我的值转换为JSON并将其写入文件。 以下是我的代码示例: void writeStructToFile(IOPipe this, struct structtype somevalues) { cJSON *jout = cJSON_CreateObject(); cJSON_AddItemToObject(jout, “V1”, cJSON_CreateNumber(somevalues.v1)); cJSON_AddItemToObject(jout, “V2”, cJSON_CreateNumber(somevalues.v2)); fprintf(this->outstream, “%s”, cJSON_Print(jout)); cJSON_Delete(jout); } 效果很好,但过了一段时间后,我发现Linux(嵌入式)因为内存使用exception或设备(在Cortex A8上)挂起而导致程序死机。 我发现调试后,即使我在结尾处删除指针,该泄漏也会出现在此函数中。 谁能看到泄漏?

C中strncpy的内存混淆

本周我的同事讨论了一个关于记忆的问题: 示例代码1: int main() { #define Str “This is String.” char dest[1]; char buff[10]; strncpy(dest, Str, sizeof(Str)); printf(“Dest: %s\n”, dest); printf(“Buff: %s\n”, buff); } 输出: Dest: This is String. Buff: his is String. 示例代码2: int main() { #define Str “This is String.” char dest[1]; //char buff[10]; strncpy(dest, Str, sizeof(Str)); printf(“Dest: %s\n”, dest); //printf(“Buff: %s\n”, buff); […]

Valgrind喜欢Mac OS 10.7(Lion)上的工具

我需要一个工具,帮助我以类似的方式在val程序中找到内存泄漏。 它应该指出程序何时覆盖内存不应该(例如通过错误计算数组索引)。 我了解到泄漏实用程序以及图形仪器应用程序。 但是我认为它只能找到分配了新的(或malloc)的内存,这些内存未被释放且不再可访问。 我还了解到valgrind应该适用于旧版本(10.5和10.6),但我使用的是Lion(10.7)。