我有这个带有嵌套闭包的例子,它演示了内存泄漏
use v5.10;
use strict;
package Awesome;
sub new {
bless {steps => [], surprise => undef}, shift;
}
sub say {
print "awesome: ", $_[1], "\n";
}
sub prepare {
my ($self, @steps) = @_;
for my $s (@steps) {
push @{$self->{steps}}, sub {
$self->say($s);
if ($s eq 'pony') {
$self->{surprise} = sub {
$s;
}
}
};
}
}
sub make {
my $self = shift;
while (my $step = shift @{$self->{steps}}) {
$step->();
}
if ($self->{surprise}) { …Run Code Online (Sandbox Code Playgroud) 我通过不同线程的 gethostbyname() 进行了 DNS 解析实验。我关闭了网络链接并运行了下面的程序。输出是这样的
gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 开始于 1411234734 gethostbyname 完成于 1411234774 gethostbyname 完成于 1411234814 gethostbyname 完成于 1411234854
gethostbyname() 同时开始,但在 40 秒超时后一一完成。
然后我尝试了 getaddrinfo()。看起来这个函数没有遇到这个问题
getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 开始于 1411235759 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799 getaddrinfo 完成于 1411235799
那么,为什么我得到这个结果,这种行为是否仅针对 Linux?
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>
void *resolve_ghbn(void *host) {
printf("gethostbyname started at %d\n", time(NULL));
struct hostent *rslv = gethostbyname((char*)host);
printf("gethostbyname finished at %d\n", time(NULL)); …Run Code Online (Sandbox Code Playgroud)