2013-01-22 2 views
1

Кто-то тут написал следующее, в области видимости файла:Объект не-POD с общей связью: что должно произойти?

std::auto_ptr<ClassWithDestructor> an_auto_ptr; 

Они означало добавить static но пренебрегали его.

Затем две разные общие библиотеки linux, каждая из которых содержит .o, содержащую это объявление, оказалась связанной с исполняемым файлом.

auto_ptr::~auto_ptr этот предмет был просмотрен дважды, и это приводит к плохим последствиям.

Это определенное поведение, неопределенное поведение или ошибка gcc + ld?

+1

Что это касается Фортрана? – tpg2114

+0

Декларации, в которых нет ни внешних, ни статических, являются «Fortran common». По крайней мере, нам старые пердуны. Если это окажется слишком отвлекающим, я удалю слово «fortraN». – bmargulies

+2

Это отвлекает и вводит в заблуждение. Такое объявление не работает, как обычные блоки Fortran. –

ответ

1

Это заявление также является определением. У вас есть два определения для одного и того же объекта в программе. Это является нарушением правила одного определения и, следовательно, неопределенного поведения.

+0

Даже в отдельных разделяемых библиотеках? Не могли бы вы получить только два совершенно разных объекта? Я согласен с вами в том, что если оба эти файла были связаны с одной и той же библиотекой, это определенно нарушит правило. – StilesCrisis

+0

Если они были в одной и той же библиотеке, вы просто получите ошибку «дубликата символа». При использовании общих библиотек все символические ссылки в * обеих * libs разрешаются для первой загружаемой. Таким образом, вторая lib видит только определение из первого, но код ctor/dtor все еще работает дважды. Теперь есть способ заставить каждую библиотеку попытаться разрешить внутри себя сначала - использовать флаг -Bsymbolic для компоновщика * во время создания библиотеки * (но это не рекомендуется, и я полагаю, что его проще перекомпилировать). –

+0

Просьба уточнить. Если в обычном исполняемом файле вы использовали это (без extern, no static), это C++ вызывает компоновщик, чтобы дать ошибку, даже если он отлично подходит для C? Можете ли вы ссылаться на правило? – bmargulies

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