Вызов функций уровня модуля из деструктора в D (кажется, выбрасывает OutOfMemoryError) - PullRequest
6 голосов
/ 06 сентября 2011

У меня есть глобальный модуль D, который содержит некоторые вспомогательные функции (а именно для ведения журнала), которые находятся на уровне модуля, а не в классе.Однако при вызове этих функций из деструктора я получаю core.exception.OutOfMemoryError и / или приложение зависает и вылетает.Я что-то здесь не так делаю?

Сокращенный тестовый пример:

logger.d

module main.logger;
void log(const(char)[] msg) {
    auto time = // GET TIME OF DAY SOMEHOW
    std.stdio.writeln(std.conv.to!string(time) ~ " " ~ msg);
}

class.d

module main.class;
import main.logger;

class A {
    public:
        this() {}
        ~this() { log("Destructor"); }
}

1 Ответ

4 голосов
/ 06 сентября 2011

Сборщик мусора в настоящее время не поддерживает генерируемые исключения или выделения памяти, вызываемые из финализатора.Таким образом, вы не можете надежно делать что-либо, что вызывает выделение или генерирует неперехваченное исключение внутри деструктора класса.

...