Каково время жизни структуры, полученной от free'd линейного объекта? - PullRequest
0 голосов
/ 04 октября 2018

Рассмотрим:

#include "share/atspre_staload.hats"

%{^
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
%}
typedef statbuf = $extype "struct stat"
extern fun cstat: (string, &statbuf? >> statbuf) -> int = "mac#stat"
extern fun S_ISDIR: int -> bool = "mac#"
extern fun stat_mode: statbuf -> int = "mac#stat_mode"
%{
#define stat_mode(x) x.st_mode
%}

datavtype statbuf_vt = STAT of statbuf

fun stat(path: string): Option_vt(statbuf_vt) =
    let
        val buf = STAT(_)
        val STAT(hole) = buf
        val res = cstat(path, hole)
        prval _ = fold@(buf)
    in
        if res = 0 then Some_vt(buf)
        else
            let
                val ~STAT(_) = buf
            in
                None_vt()
            end
    end

implement main0() =
    let
        val path = "/etc/passwd"
        val- ~Some_vt(~STAT(buf)) = stat(path)
    in
        println!(~S_ISDIR(stat_mode(buf)))
    end

Каково время жизни buf в конце?Похоже, его не нужно освобождать - valgrind видит 3 выделения и 3 освобождения, и никаких проблем.Но не является ли buf часть памяти, управляемая этим STAT линейным объектом?

1 Ответ

0 голосов
/ 19 октября 2018

Примечание 'buf' - это плоская структура.Любое значение, которое соответствует шаблону ~ STAT (buf), освобождается;перед освобождением некоторый контент в значении копируется в «buf», который находится в стеке.Время жизни 'buf' заканчивается, когда кадр для вызова 'main0' раскручивается.В представленном коде нет утечек.

...