Tag: memory leaks

JNI本机代码上的内存泄漏

我有一段JNI本机代码。 当我们调用此本机方法+运行其他请求时,jvm将崩溃。 最有可能的是,这段JNI本机方法(c代码)中存在内存泄漏。 任何正文可以帮助检测下面代码中的内存泄漏? #include #include #include #include “fns_data.h” #include “fns_client.h” #include “sockRW.h” #include “/usr/local/include/jni.h” #include “JNIiSearchLib.h” #include “com_eds_wise_util_JNIiSearchLib.h” JNIEXPORT jstring JNICALL Java_com_eds_wise_util_JNIiSearchLib_jniFNSSearchClient ( JNIEnv *env, jobject obj, jstring jip_addr, jint jport_number, jstring jfield, jstring jquery_str, jint jhitnum) { HitIds *hit_list = NULL; hitListPktStruct *hitPkt = NULL; int hit_number = 0; int i = 0; […]

C中链表的可用内存

我一直试图释放加载到链表中的文件的已分配内存,我已设法释放节点,但我无法弄清楚如何释放文件的值副本的已分配内存。 我尝试过这样的事情: void FreeString(struct node * newNode) { for (int i = 0; i string); } } 但是编译器会因为分段错误而崩溃,而valgrind仍会指出内存泄漏。 如果有人能告诉我我做错了什么,并指出正确的方向,我们将不胜感激。 完整代码: 结构: typedef struct node { char *string; struct node *next; }node; //这里的主要function…… void Push(struct node **RefHead, char *word) { struct node *newNode = NULL; newNode = (struct node *)malloc(sizeof(node)); newNode->string = (char*)malloc(strlen(word) + 1); // […]

删除头function中的内存泄漏

嘿大家我在删除头function中出现内存泄漏。 我想可能是因为我没有释放头部,但我似乎无法找到正确的位置。 我正在思考L-> head = L-> head-> next; data_t * removehead(list_t *L) { data_t *temp = NULL; } if (L->head != NULL) { temp = L->head->data_ptr; L->head = L->head->next; L->size–; } return temp; } 有什么想法吗?

有没有什么方法可以释放生成的java代码中的内存来通过JNI / JNA绑定C代码?

我正在使用一个使用JNA绑定到原始C库的Java库(该库名为Leptonica)。 我遇到了一种情况,必须在C代码中调用free(data)来释放内存。 但是,java中是否有任何可以释放内存的function? 在C代码中 void ImageData::SetPixInternal(Pix* pix, GenericVector* image_data) { l_uint8* data; size_t size; pixWriteMem(&data, &size, pix, IFF_PNG); pixDestroy(&pix); image_data->init_to_size(size, 0); memcpy(&(*image_data)[0], data, size); free(data); } 函数pixWriteMem()将为“数据”创建和分配内存,您需要自由(数据)以便以后释放内存。 在Java代码中,我只能访问pixWriteMem(),而不能访问SetPixInternal(),所以我无法释放“数据”,这会造成内存泄漏。

麻烦发现内存泄漏cStringUsingEncoding

嘿,我试图使用cStringUsingEncoding将NSString转换为C字符串,但我有内存泄漏。 我的理解是cStringUsingEncoding返回一个指向字符数组的指针,该字符数组只保证在NSString对象的持续时间内存在。 因此,您应该将其内容复制到另一个字符串。 这就是我的问题所在…… 我有一个函数接受NSString并将其转换为C字符串副本。 仅仅为了测试,我运行了以下方法的1000次迭代(以确保没有泄漏)。 -(void)test{ NSString *test = [[NSString alloc] initWithString:@”Hello world!”]; for(int i=0; i<1000; i++) { char *tmp = [self returnCopiedCString:test]; //free memory free(tmp); } [test release]; } 相当直接的代码……问题是它像疯了一样泄漏。 现在在你得出结论之前我的returnCopiedCString函数工作得很好。 我通过声明和复制C字符串来测试它,以排除这是一个问题的可能性。 在函数内部我使用以下代码进行转换 -(char *)returnCopiedCString:(NSString *)input{ //retain input [input retain]; //get length of encoded C-string int len = [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; //allocate memory for […]

使用OpenMP进行编译会导致内存泄漏

根据valgrind的说法,在使用OpenMP编译一个简单的hello-world程序时,我可能会导致内存泄漏。 这没有意义,因为hello-world程序不会故意使用任何OpenMPfunction。 假设下面的程序名为hi.c并根据编译 $ gcc -o hi hi.c GCC版本4.8.3 #include int main( void ) { printf( “hi\n” ); return 1; } 我们应该期待来自valgrind的泄漏报告来validation显而易见的:没有泄漏。 我的观察结果与此假设一致: $ valgrind –tool=memcheck ./hi ==13064== Memcheck, a memory error detector ==13064== Copyright (C) 2002-2013, and GNU GPL’d, by Julian Seward et al. ==13064== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright […]

C链表中的内存泄漏

我一直在为学校做一个项目(今晚到期!),我有一些严重的记忆问题。 我对C很新,当涉及到mallocing指针等等时,我仍然被抛出一个循环,所以我真的可以使用一些帮助。 代码如下。 文件的顺序是LinkedLists.h(LinkedList模块的Header),LinkedLists.c(LinkedList模块)和TestList.c(主模块)。 /****************************************************************************** * Base struct to contain data structure element information: deterimined by * the application needs. ******************************************************************************/ #ifndef _LINKED_LISTS_H_ #define _LINKED_LISTS_H_ typedef struct ElementStructs { int ElementPosition; char* ElementValue; } ElementStructs; /************** Nothing else in the module needs to be modified *************/ /****************************************************************************** * Base struct of list nodes, contains user […]

如何在编译时启用Leak Sanitizer?

GCC和Clang编译器都支持LeakSanitizer ,它有助于在C程序中查找内存泄漏。 有时内存泄漏是不可避免的(因为它正在测试套件中进行测试)。 可以使用Leak Sanitizer界面注释这样的内存: #include void *p = create_new_object(); __lsan_ignore_object(p); 然而,这将在不支持LSan的编译器上中断。 在Address Sanitizer中,此构造可用于检测ASAN的可用性: /* __has_feature(address_sanitizer) is used later for Clang, this is for * compatibility with other compilers (such as GCC and MSVC) */ #ifndef __has_feature # define __has_feature(x) 0 #endif #if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__) /* ASAN-aware code here. */ #endif 没有__has_feature(leak_sanitizer)来检测Clang中__SANITIZE_LEAKS__存在__SANITIZE_LEAKS__ ,GCC也不存在__SANITIZE_LEAKS__ 。 […]

valgrind给出错误但无法找到位置

我已经开始在一天前使用valgrind正如SO本身的人所建议的那样。这是一个了不起的工具,但今天我遇到了一个问题。它给出了以下错误: definitely lost bytes但无法告诉错误的位置。 这是valgrind的输出: udit@udit-Dabba ~ $ valgrind –leak-check=full sendip -v -p ipv6 -f file.txt -6s ::1 -p ah -as 0x20 -aq 0x40 -ak “yugal” -am xorauth.so -p udp -us 21 – ud 21 ::2 ==12885== Memcheck, a memory error detector ==12885== Copyright (C) 2002-2010, and GNU GPL’d, by Julian Seward et al. ==12885== […]

Valgrind:无效读取大小4 – > sigsegv,没有valgrind和视觉工作室工作正常

我已经实现了一种压缩算法(使用霍夫曼编码),它使用节点的优先级队列(我定义的结构)。 现在,当我在linux或visual studio中运行代码时,一切正常。 当我检查visual studio中的内存泄漏时,没有给出。 现在的问题是,当我使用valgrind分析我的程序时,它终止于信号11(sigsegv)。 遇到的第一个错误是方法delete min中的“无效读取大小4”。 之后的其他错误是:Adress在大小为453的块中释放0字节,无效写入大小4,无效释放,删除或重新分配。 任何人都可以给我一些关于我可能犯的错误的建议吗? 我一直在互联网上搜索几个小时,但找不到我做错了什么(特别是因为它在没有使用valgrind时才起作用)。 或者提示如何调试并找出导致读取错误的原因。 非常感谢! 这是代码,以防有人想要查看它,但我想这并不是那么容易潜入这个特定的代码。 我猜它与代码的优先级队列有关: 我做霍夫曼部分的部分 – >每次删除2个最小节点并将两者的总和作为一个节点添加。 while(queue->size > 1){ node* n1 = delete_min(queue); node* n2 = delete_min(queue); // all the errors are encountered in this call node* temp = (node*) calloc(sizeof(node),1); temp->amount = n1->amount + n2->amount; insert_node(queue,temp); n1->parent = temp; n2->parent = temp; […]