Schemeã§consã¯å¤±æããã
ãSchemeã¿ããã«ã¡ã¢ãªç®¡çãé è½ãã¦ãã¾ã£ã¦ããè¨èªã§ã¯ãã¡ã¢ãªç¢ºä¿ã«å¤±æããå ´åã«ã©ãããã°ããã®ã ãããä¾ãã°ãconsããããã¨ããã¨æ°ããã¡ã¢ãªé åãå¿
è¦ã«ãªã£ã¦ããã®ã§ãconsã«ã¯ããããªãã失æã®å¯è½æ§ãããã
ãã¨ããããããèãããconsã失æããã¨ããã£ã¦è¦ããã¨ããªããããã¯å®é¨ãã¦ã¿ãªããã°ã
ãã¨ããããã§ãfailmallocã使ã£ã¦goshãèµ·åãã¦ã¿ãã®ã ãã*** SYSTEM-ERROR: couldn't get home directory.ãã¨ãã¨ã©ã¼ãåããã®ã®ãèµ·åããããããã(define a (cons 0 1))ã¨ããã£ã¦ãã¡ããã¨åããã©ãããã¡ã¢ãªç¢ºä¿ã«mallocã使ã£ã¦ãªãæ°ããããBoehm GCã ãã
ãã½ã¼ã¹ãèªãã§ã¿ãã¨ãããBoehm GCã¯sbrkï¼å ´åã«ãã£ã¦ã¯mmapã使ã£ã¦ãï¼ï¼ã§ã¡ã¢ãªã確ä¿ãã¦ããã¿ããã ãã¨ããäºã¯ãsbrkã䏿¸ãããã°ã¡ã¢ãªç¢ºä¿ã失æãããããã¨æããããããããªäºãããã¨ã¤ã³ã¿ããªã¿èªä½ãèµ·åããªããªãæ°ããããããããç®çã¯consã失æãããã©ããªãããç¥ããã¨ãªã®ã§ãå¦çç³»èªä½ã¯èµ·åãã¦ãããªãã¨å°ãã
ãã¨ããããã§ãå®éã«ã³ã¼ããæ¹é ãã¦å®é¨ãããã¨ã¯ããããã¦ãã³ã¼ããèªãã§ã¿ããGaucheã§ã¯ãconsã«å¯¾å¿ããCã®é¢æ°ã¯Scm_Consã«ãªã£ã¦ããããã®é¢æ°ã¯çãã®ã§ãä¸èº«ãå
¨é¨å¼ç¨ãã¦ã¿ãã
ScmPair *z;
SCM_MALLOC_WORDS(z, sizeof(ScmPair)/sizeof(GC_word), ScmPair*);
SCM_SET_CAR(z, car);
SCM_SET_CDR(z, cdr);
return SCM_OBJ(z);
ãSCM_MALLOC_WORDSã¯ãã¯ãã§ãããGC_MALLOC_WORDSãå¼ãã§ãããGC_MALLOC_WORDSãã¡ã¢ãªç¢ºä¿å¤±ææã«NULLãè¿ããªããzã¯NULLã«ãªãã¯ãã ãæ¬¡ã«ãSCM_SET_CARã¯ã©ããªã£ã¦ãããã ãããã¯ããå±éããã¨z->car = carã«ãªããNULL checkã¯ç¹ã«è¡ããã¦ããªãã®ã§ããã¶ãããã§Segmantation faultãèµ·ãããã¨ã«ãªãã®ã§ã¯ãªããã¨æãããã
ãçµè«ã¨ãã¦ã¯ãconsã失æãããsegvã§è½ã¡ãã®ã§ãconsã®æ»ãå¤ããã§ãã¯ããã³ã¼ããæ¸ãã¦ãæå³ããªãã¨ããäºã«ãªããã®ã ãããã
ãããããScm_Consã«NULL checkãå
¥ããã¹ãã§ãããã¨ææ¡ããã¹ãã§ããã®ãã©ããã¯ã¡ãã£ã¨ããããªããã¡ã¢ãªãå°ãªããªã£ã¦ãããGCãè¶
é å¼µã£ã¦ãããã§ããã¡ãªãsegvãã¨ããã®ã¯ããã¯ããã§å²ãããã¨ãã¦ã¢ãªãªã®ã§ã¯ãªãããããsegvãã¦æ¬²ãããªãããã¹ã¯ããã«10GBãããå²ãå½ã¦ã¨ãããã¨ãメモリ確保の失敗に関する考察ãèªãã§ããsegvã§ããããããã¨ããæè¦ã«å¯¾ãã¦ãããããªãããããã¯ãã¡ã¢ãªä¿è·æ©è½ããã¡ãã¨ãããã·ã¹ãã ã«ã®ã¿é©ç¨ã§ãããã¨ã ã ãã¨åè«ãã¦ãããGaucheãã¾ã¨ãã«åããããããªã·ã¹ãã ã¯ã¡ã¢ãªä¿è·æ©è½ã¯ã¤ãã¦ããã¨æå¾
ãã¦ãããã®ã§ã¯ãªããããã
ããããã§ããã£ã±ããã¨ã©ã¼å¦çããããæããããªãããããæã«ã¯consã失æããã ãã§æ»ã¬ã®ã¯å°ãæ°ããããããããconsã失æãããä½ãè¿ãã¹ããªã®ããããããããªãã