Kubeflow: Ошибка при загрузке общих библиотек: libcuda.so.1

Время жизни переменных функции static начинается с первого раза [0], поток программы встречает декларацию и заканчивается при завершении программы. Это означает, что время выполнения должно выполнять некоторую книгу, чтобы уничтожить ее, только если она была построена.

Кроме того, поскольку стандарт говорит о том, что статические объекты деструкторов должны выполняться в обратном порядке завершения их построения [1], а порядок построения может зависеть от конкретного прогона программы, порядок

struct emitter {
    string str;
    emitter(const string& s) : str(s) { cout << "Created " << str; << endl; }
    ~emitter() { cout << "Destroyed " << str << endl; }
};

void foo(bool skip_first) 
{
    if (!skip_first)
        static emitter a("in if");
    static emitter b("in foo");
}

int main(int argc, char*[])
{
    foo(argc != 2);
    if (argc == 3)
        foo(false);
}

Выход:

C:> sample.exe Создано в foo Разрушено в foo

C:> sample.exe 1 Создано в if Создано в foo Разрушено в foo Разрушено в if

C:> sample.exe 1 2 Создано в foo Создано, если уничтожено, если уничтожено в foo

[0] Поскольку C ++ 98 [2] не имеет ссылки на несколько потоков, как это будет вести себя в многопоточной среде, является неуказанным и может быть проблематичным, поскольку упоминается Родди .

[1] Раздел C ++ 98 3.6.3.1 [basic.start.term]

[2] В C ++ 11 статики инициализируются безопасным потоком, это также известно как Magic Statics .

0
задан sdcbr 28 January 2019 в 12:43
поделиться