- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Mac OS X 10.13.4。运行该程序会触发 Valgrind 中的内存泄漏信号并泄漏系统调用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char *ft_strcpy(char *s1, const char *s2)
{
size_t cur;
cur = -1;
while (s2[++cur] != '\0')
s1[cur] = s2[cur];
s1[cur] = '\0';
return (s1);
}
void ptr_test()
{
char *ptr;
ptr = (char *)malloc(sizeof(char) * 15);
printf("FIRST: %p\n", ptr);
ft_strcpy(ptr, "Hello, World!");
printf("SECOND: %p\n\n", ptr);
free(ptr);
}
int main(void)
{
pid_t pid;
pid = fork();
while(1)
ptr_test();
if (pid != 0)
wait(NULL);
return (0);
}
泄漏系统调用:
Process: main [98746]
Path: /nfs/2018/p/patrisor/Desktop/ptr/main
Load Address: 0x1095a2000
Identifier: main
Version: ???
Code Type: X86-64
Parent Process: main [98687]
Date/Time: 2019-09-22 05:28:32.273 -0700
Launch Time: 2019-09-22 05:28:23.881 -0700
OS Version: Mac OS X 10.13.4 (17E199)
Report Version: 7
Analysis Tool: /usr/bin/leaks
Physical footprint: 280K
Physical footprint (peak): 280K
----
leaks Report Version: 3.0
Process 98746: 176 nodes malloced for 27 KB
Process 98746: 4 leaks for 4128 total leaked bytes.
Leak: 0x7f9d9ad00040 size=16 zone: DefaultMallocZone_0x1095a7000
Leak: 0x7f9d9ad00050 size=16 zone: DefaultMallocZone_0x1095a7000
Leak: 0x7f9d9b800800 size=2048 zone: DefaultMallocZone_0x1095a7000
Leak: 0x7f9d9b801000 size=2048 zone: DefaultMallocZone_0x1095a7000
瓦尔格林德:
==1388== LEAK SUMMARY:
==1388== definitely lost: 32 bytes in 2 blocks
==1388== indirectly lost: 4,096 bytes in 2 blocks
==1388== possibly lost: 72 bytes in 3 blocks
==1388== still reachable: 215 bytes in 7 blocks
==1388== suppressed: 27,726 bytes in 170 blocks
==1388==
==1388== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 13 from 13)
最初我怀疑这是 free() 无法使用正确的 malloc 地址的问题。但是,当我手动扫描进程的内存使用情况时,运行时的使用情况并未出现显着增加。后来我怀疑是子进程没有正确结束,可能创建了僵尸进程。泄漏发生在开始时调用 free 的地方。是函数本身有问题,还是……?我似乎很失落。
有什么猜测吗?
最佳答案
以下内容包含对代码问题的评论:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/*
* strongly suggest:
* #include <string.h> and
* eliminating this function and in ptr_test()
* strcpy( ptr, "Hello, World! );
*/
char *ft_strcpy(char *s1, const char *s2)
{
size_t cur;
/* this causes an implicit conversion to unsigned
* so the value will be seen as a VERY LARGE number
* suggest initialize to 0 then use:
* while( s2[cur++] != '\0' )
*/
cur = -1;
while (s2[++cur] != '\0')
s1[cur] = s2[cur];
s1[cur] = '\0';
return (s1);
}
void ptr_test()
{
char *ptr;
/*
* returned value from malloc has type `void*`
* which can be assigned to any pointer
* casting just clutters the code,
* making it more difficult to understand, debug, etc
* suggest removing that cast.
*/
/* sizeof( char ) is defined in the c standard as 1
* multiplying anything by 1 has no effect
* suggest removing that expresson
*/
/*
* when calling any of the heap allocation functions
* always check (!=NULL) the returned value
* to assure the operation was successful
* if not successful, call 'perror( "malloc failed" );
* to output your error message and the text reason
* the system thinks the error occurred to 'stderr'
*/
ptr = (char *)malloc(sizeof(char) * 15);
printf("FIRST: %p\n", ptr);
ft_strcpy(ptr, "Hello, World!");
printf("SECOND: %p\n\n", ptr);
free(ptr);
}
int main(void)
{
pid_t pid;
pid = fork();
/*
* this runs 'ptr_test()' FOREVER
* and in the fork() error condition FOREVER
* and in the child process FOREVER
* and in the parent process FOREVER
*
* note: 'exit()' and EXIT_SUCCESS are from
* the header file: `stdlib.h`
* Suggest:
* if( !pid )
* { // then child process
* for( int i=0; i<1024; i++ )
* ptr_test();
* exit( EXIT_SUCCESS );
*/
while(1)
ptr_test();
/* there are three types of returned values from 'fork()'
* <0 means an error occurred
* ==0 means in the child process
* >0 means in the parent process
*
* a test for '!=0' will 'catch' the error AND the parent
* however, there is no child process for the parent to 'wait()'
* strongly suggest testing for each condition separately
* I.E.
* if( pid < 0 )
* //handle error
* perror( "fork failed" );
* else if( !pid )
* // handle child process ...
* exit( EXIT_ SUCCESS );
* else
* // handle parent process
* wait( NULL );
*/
if (pid != 0)
/* the prototype for 'wait()' is missing
* strongly suggest adding the header files:
* #include <sys/types.h>
* #include <sys/wait.h>
*/
wait(NULL);
return (0);
}
关于c - 父进程调用fork()后子进程内存泄漏,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58049380/
IntentReceiver 正在泄漏 由于 onDetachedFromWindow 在某些情况下未被调用。 @Override protected void onDetachedFromWind
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我编写了一个测试代码来检查如何使用 Instrument(Leaks)。我创建了一个单一 View 应用程序,单击按钮后我加载了一个像这样的新 View ... - (IBAction)btn_clk
我正在使用这个简单的代码并观察单调增加的内存使用量。我正在使用这个小模块将内容转储到磁盘。我观察到它发生在 unicode 字符串上而不是整数上,我做错了什么吗? 当我这样做时: >>> from u
我有以下泄漏的代码。 Instruments 表示,泄漏的是 rssParser 对象。我“刷新”了 XML 提要,它运行了该 block 并且发生了泄漏...... 文件.h @interface
我在我编写的以下代码片段中发现了内存泄漏 NSFileManager *fileManager=[[NSFileManager alloc] init]; fileList=[[fileManager
因此,我正在开发HTML5 / javascript rts游戏。观察一直有几种声音在播放。因此,对我来说,是一段时间后声音听起来像是“崩溃”,并且此浏览器选项卡上的所有声音都停止了工作。我只能通过重
下面是我正在使用的一段代码及其输出。 my $handle; my $enterCount = Devel::Leak::NoteSV($handle); print "$date entry $en
在这篇关于 go-routines 泄漏的帖子之后,https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sende
我想知道为什么在执行 ./a.out 后随机得到以下结果。有什么想法我做错了吗?谢谢 http://img710.imageshack.us/img710/8708/trasht.png 最佳答案 正
我正在 Swift 中开发一个应用程序,在呈现捕获我放在一起的二维码的自定义 ViewController 后,我注意到出现了巨大的内存跳跃。 该代码本质上基于以下示例:http://www.appc
下面是我的 javascript 代码片段。它没有按预期运行,请帮我解决这个问题。 function getCurrentLocation() { console.log("insi
我们在生产环境中部署了 3 个代理 Kafka 0.10.1.0。有些应用程序嵌入了 Kafka Producer,它们将应用程序日志发送到某个主题。该主题有 10 个分区,复制因子为 3。 我们观察
我正在使用仪器来检测一些泄漏,但有一些泄漏我无法解决; NSMutableString *textedetails = [[NSMutableString alloc] init];
如果我使用性能工具测试我的代码 - 泄漏,它没有检测到任何泄漏。这是否意味着代码没有泄漏任何内存? 我有一个越狱的 iPhone,我可以监控可用内存。如果有人知道,那就是 SBSettings。我测试
我在从 AddressBook 中获取图像时遇到了很大的问题,下面我粘贴了我的代码。此 imageData 从未被释放,在我的 Allocations Instruments 上它看起来总是在内存中它
- (NSMutableArray *)getArrayValue:(NSArray *)array{ NSMutableArray *valueArray = [NSMutableArra
Instruments 工具说这是一个泄漏,有什么想法吗? 我在 for 循环结束时释放变量对象 在上述方法的开头,这就是我设置变量对象的方式,即自动释放; NSMutableArray *varia
我正在跟踪我的 iOS 应用程序的内存泄漏,我有一个奇怪的泄漏导致我的应用程序崩溃......负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。在某些时候,我的应
我正在尝试使用 NSOperationQueue 在后台线程中执行一个方法,如下所示: NSOperationQueue *queue = [NSOperationQueue new]; NS
我是一名优秀的程序员,十分优秀!