2015-12-07 8 views
0

Я пытаюсь написать некоторый переносимый код, и я думал, как же Microsoft реализовать старые процедуры C во время выполнения, как gmtime или FOPEN, и т.д., которые были возвращающей указатель , напротив сегодняшних gmtime_s или fopen_s который требует, чтобы объект прошел и возвращает errno код состояния (я думаю).Microsoft C Run Time - теперь и до

Одним из способов было бы создать статический (лучше, чем глобальный) объект внутри таких подпрограмм и вернуть указатель на него, но если один объект в настоящее время использует этот статический указатель, а другой объект вызывает эту процедуру, первый объект получит измененный буфер - что плохо.

Кроме того, я сомневаюсь, что в таких подпрограммах используется динамическая память, потому что это приведет к утечке памяти.

Как и в случае с другими материалами Microsoft, реализация не открывается, поэтому я могу принять пик. Какие-либо предложения?

+0

Зачем вам нужны статические объекты? Почему динамическая память вызывает утечку памяти? –

+1

Если я правильно помню, большинство частей исходного кода среды MS C * распространяются вместе с Visual Studio. –

+0

Вы можете перестать гадать и [прочитать официальную ссылку] (https://msdn.microsoft.com/en-us/library/z5hh6ee9.aspx). Или [ссылка написана по спецификации] (http://en.cppreference.com/w/c/io/fopen). –

ответ

1

Относительно gmtime, вы в порядке; он мог бы работать с переменной, которая имеет продолжительность хранения static (которая равна той же длительности хранения, что и переменные, объявленные «глобально», кстати ... В C нет «глобального»). Исторически говоря, вы, вероятно, должны предположить, что это так, потому что C не требует поддержки многопоточности. Если вы имеете в виду эпоху, когда существует достойная поддержка многопоточности, вероятно, что gmtime может вернуть что-то, что имеет конкретную продолжительность хранения данных на входе, вместо этого, как the MSDN documentation for gmtime говорит , говорит, что gmtime и другие подобные функции «... все используют один общий tm в потоке для преобразования ».

Однако fopen - это функция, которая создает ресурсы, и в результате разумно ожидать, что каждое возвращаемое значение будет уникальным (если только это ошибочное возвращаемое значение).

Действительно, fopen представляет собой динамическое управление; вы должны позвонить fclose, чтобы закрыть FILE, как только вы закончите с этим ... Если вы забудете закрыть файл время от времени, нет необходимости в панике, так как стандарт C требует, чтобы программа закрывалась все FILE s, которые все еще открыты после завершения программы. Это означает, что программа отслеживает все ваши FILE с за кулисами.

Однако, было бы плохой практикой повторять дескрипторы файла утечки, снова и снова, постоянно, в течение длительного периода времени.

+0

Как насчет использования интеллектуальных указателей? Мы могли бы реализовать такую ​​процедуру, которая могла бы использовать интеллектуальный указатель для результирующего объекта. Система должна уничтожить такую ​​память после использования, и у нас все еще будет процедура, которая вернет указатель. Я просто не знаю о (потенциальной) системной накладной, имея дело с этими умными указателями. –

+0

@ MilošLumović Вы имеете в виду «умные указатели», которые имеет C++, в вопросе, который не имеет ничего общего с C++? – Sebivor

+0

Не против, но да. Как я уже сказал, я думаю о правильном подходе. Вопрос был связан с временем выполнения C, чтобы я мог понять концепцию, лежащую в ее основе. –

1

Ну, во-первых, такие глобалы и статика не могут использоваться в любом случае из-за безопасности потоков.

Использование динамической памяти, массивов или массивов ручек или других подобных комбо-ресурсов Утечка ресурсов, если программист их неправильно использует. На нетривиальной ОС такие ресурсы связаны с процессом и освобождаются при завершении процесса, поэтому это серьезная проблема для приложения, но не для ОС.

+1

Вы можете использовать локальное хранилище потоков с помощью C11 и некоторых более ранних компиляторов это также. – StephenG

+0

@StephenG что вы имеете в виду. Можете ли вы объяснить эту идею? –

+1

Когда вы объявляете переменную как поток локальной, компилятор будет генерировать код, который гарантирует, что каждый поток будет работать на собственной версии этой переменной. Магия происходит за кулисами. Это может помочь [http://stackoverflow.com/questions/5450694/thread-local-storage-overhead]. – StephenG

0

Я не уверен в специфике Visual Studio, но эти библиотеки функций обычно реализуются как непрозрачный тип. Вот почему они возвращают указатель и почему вы не можете знать содержимое структуры FILE.

Значение будет либо в пуле статической памяти, либо в вызове функции malloc внутри функции. Нет никаких гарантий того, что функции библиотеки C являются повторными.

Вызов fopen без соответствующего fclose может действительно создать утечку памяти: во всяком случае у вас есть «утечка ресурсов». Поэтому убедитесь, что вы всегда вызываете fclose.

Что касается деталей реализации: у вас не может быть исходного кода Visual Studio, но вы можете скачать