2017-02-01 1 views
2

Мне задали этот вопрос на собеседовании сегодня. К сожалению, я не уверен, что правильно воспроизвел его здесь. Я просто помню, что я не очень хорошо ее понимал. Вопрос может бытьКакие проблемы могут связывать как статические, так и динамические библиотеки с одной и той же исполняемой причиной?

«Какие проблемы могут возникать при загрузке статически и динамически скомпилированных DLL ?»

я не знаю ответ, но интервьюер сказал мне, что есть по крайней мере две основные проблемы:

  1. Библиотека времени выполнения: могут быть некоторые несовместимые распределения и де-распределение памяти.

  2. К сожалению, здесь мы прервались, и мы не вернулись к этому вопросу.

Пожалуйста, не могли бы вы помочь мне понять, каков был этот вопрос, а также какой ответ?

Я также не понял первый пункт очень хорошо. Я думал, что в программе может быть только один malloc, я не прав?

ответ

4

Предположим, что A.dll связывается статически со стандартной версией библиотеки версии 1.0. И он имеет функцию, которая выглядит следующим образом:

char * f() { 
    return malloc(100); // uses malloc 1.0 
    } 

Теперь позволяет сказать, что есть еще одна библиотека B.dll, которая связывает динамически и статически A.DLL со стандартной библиотекой версии 1.1. Она имеет функцию, которая выглядит следующим образом:

void g() { 
     char * p = f(); // returns the result of malloc 1.0 
     free(p); // uses free 1.1 
    } 

Вы тогда, наверное (я говорю «наверное», потому что никто из этого не стандартизирован) есть указатель, который динамически выделяемый со стандартной библиотекой 1.0, но был освобожден с версией 1.1. Это может часто приводить к серьезным и трудным для диагностики проблем.

+0

Спасибо! Под «стандартной библиотекой» вы подразумеваете библиотеку времени выполнения, или вы подразумеваете, что она включена в стандартную библиотеку? –

+1

Ни стандарты C, ни C++ ничего не говорят о библиотеке времени выполнения. malloc и free являются частью стандартных библиотек на обоих языках. –

1

Поскольку статически скомпилированные dlls скомпилированы до выполнения, если вам нужно что-либо изменить (например, функции), вам придется перекомпилировать файл .exe. Статически скомпилированные DLL также больше, чем динамически связанные DLL. Динамически связанные DLL связаны во время выполнения, поэтому каждая программа имеет к ним доступ, потому что все функции имеют особое место в памяти, не имея нескольких копий (например, когда они статически скомпилированы). Надеюсь это поможет.

+1

Нет такой вещи, как статически или динамически скомпилированный. И нет, вам не придется перекомпилировать .exe - вам, возможно, придется переустановить его. –

Смежные вопросы