Если вы объявляете его, как вы делали
STARTUPINFO si;
Тогда это разрушенный C, когда часть программы, в которой она была объявлена отделками (это называется «выходит за рамки»). Например:
void myfunct() {
STARTUPINFO si1;
if (condition) {
STARTUPINFO si2;
//...
} //si2 destroyed here
//...
} //si1 destroyed here
Даже если CreateProcess()
функция хотел сохранить SI1 или SI2, он не мог. Потому что независимо от того, что вы делаете, они будут уничтожены в этих точках.
Теперь, если вы создали си, как это:
STARTUPINFO *si = malloc(sizeof(STARTUPINFO));
Тогда он был бы уничтожен только тогда, когда вы явно назвать
free(si);
Некоторые функции API требуют, чтобы дать им то, что они могут держать , Для этих функций вы должны выделять параметры вторым или даже более сложным способом, и они расскажут вам в документации, когда вам нужно будет ее позже уничтожить.
Но большинство функций API просто копируют все, что вы им передаете, и оставляете источник таким, чтобы было легко передать указатели на структуры, объявленные в первую очередь.
Обратите внимание, что в целом нехорошо «передавать что-то API и полагаться на API, разрушающий его». Ваши приложения и функции API, которые вы, скорее всего, используете для разных менеджеров памяти. То, что было выделено в одном, не может быть освобождено в другом.
Так что в большинстве случаев такой API захочет, чтобы вы либо распределяли данные, вызывая какую-то определенную функцию, либо (чаще) просто удаляли свои данные самостоятельно.
MYPARAM *p = malloc(sizeof(MYPARAM));
APIOpen(p);
//...much later
APIClose(p);
//It's now safe to free p
free(p);
Что вы имеете в виду? Можете ли вы показать какой-то код, чтобы он дал понять. –
Я обновил вопрос. – coredump
FYI, вы забыли инициализировать 'si.cb = sizeof (STARTUPINFO);'.Во всяком случае, ваш вопрос связан скорее с C/C++, чем с winapi. –