Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2015, 17:53   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Я чуть-чуть не по теме:
Чего-то я въехать не могу, что происходит?
Код:
#include <iostream>
using namespace std;

struct S
{
    S()     { std::cout << "S::const\n"; }
    ~S()    { std::cout << "S::destr\n"; }
};

struct Cont
{
    const S &s;
    Cont(const S &s): s{s}  {cout << "Cont::const\n";}
    ~Cont()                 {cout << "Cont::destr\n";}
};

int main()
{
    Cont c{ S{} };
}
S::const
Cont::const
S:: destr
S:: destr
Cont:: destr

Это на mingw, clang и gcc выдают иной результат.
баг компилятора.
замечен у gcc.
_Bers вне форума Ответить с цитированием
Старый 27.03.2015, 13:17   #12
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Всё же я удивлен тому, что так падает (в целом, аналог ссылки со стек оверфлоу)
1.cpp
Код:
int f();
int i = f();

int main() {}
2.cpp
Код:
#include <string>
using namespace std;

static string s = "sfsd";
int f() {s += "ds"; return 1;}
Мы ведь слинковали i с функцией f, а почему f видит string неинициализированной? Внутри одного модуля нельзя никак разобраться с зависимостями?
220Volt вне форума Ответить с цитированием
Старый 27.03.2015, 13:35   #13
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

А вот ещё более удивительный случай:
1.срр без изменений.
2.срр
Код:
#include <iostream>
using namespace std;

void s() {cout << "fsfsdf";}
int f() {s(); return 1;}
Может кого-то не удивляет, но я в шоке.
220Volt вне форума Ответить с цитированием
Старый 27.03.2015, 15:50   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Всё же я удивлен тому, что так падает (в целом, аналог ссылки со стек оверфлоу)
1.cpp
Код:
int f();
int i = f();

int main() {}
2.cpp
Код:
#include <string>
using namespace std;

static string s = "sfsd";
int f() {s += "ds"; return 1;}
Мы ведь слинковали i с функцией f, а почему f видит string неинициализированной? Внутри одного модуля нельзя никак разобраться с зависимостями?
main.cpp инициализируется раньше, чем 2.cpp
поэтому, при инициализации её глобальной переменной i, производится запуск функции, которая использует не подготовленную ещё для работы стрингу.
_Bers вне форума Ответить с цитированием
Старый 27.03.2015, 15:51   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
А вот ещё более удивительный случай:
1.срр без изменений.
2.срр
Код:
#include <iostream>
using namespace std;

void s() {cout << "fsfsdf";}
int f() {s(); return 1;}
Может кого-то не удивляет, но я в шоке.
что здесь может быть удивительного?
_Bers вне форума Ответить с цитированием
Старый 27.03.2015, 16:05   #16
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
что здесь может быть удивительного?
Когда дёргаем функцию из другого модуля - это нормально. Когда дёрнутая функция дергает другую функцию, она попадает в неинициализированную область. Где логика?

ЗЫ: может не уточнил, программа падает. Почему s() оказалась непригодна для вызова?

Последний раз редактировалось 220Volt; 27.03.2015 в 16:47.
220Volt вне форума Ответить с цитированием
Старый 27.03.2015, 17:14   #17
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Если у кого-то есть свежий gcc или clang, скомпилируйте, пожалуйста, следующее:
1.cpp
Код:
int f();
int i = f();
int main() {}
2.cpp
Код:
#include <iostream>
using namespace std;

void s() {cout << "fsfsdf";}
int f() {s(); return 1;}
g++ 2.cpp 1.cpp
Программа падает? Если нет, то
g++ 2.cpp 1.cpp

Вдруг у меня барахлит mingw.
220Volt вне форума Ответить с цитированием
Старый 28.03.2015, 07:46   #18
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Очень отзывчивые участники ))
Дело в неинициализированном cout. Я считал, что cout имеет приоритет при инициализации и был прав лишь частично. Цитата из справочника:
Код:
These objects (std::cout, std::wcout) are guaranteed to be initialized
during or before the first time an object 
of type std::ios_base::Init is constructed and are available for
use in the constructors and destructors of static objects (as long as
<iostream> is included). 
Код:
static storage duration. The storage for the object is allocated when
the program begins and deallocated when the program ends. Only one
instance of the object exists. All objects declared at namespace scope
(including global namespace) have this storage duration, plus those declared
with static or extern.
Т.е. должная инициализация cout гарантируется, если в модуле, gv которого использует cout, есть #include <iostream>. При переписи 1.cpp следующим образом:
Код:
#include <iostream>
int f();
int i = f();
int main() {}
программа перестала падать.

Это я так понял вопрос, может и ошибаюсь где-то.

Последний раз редактировалось 220Volt; 28.03.2015 в 07:49.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
порядок вызова конструкторов глобальных объектов через границы единиц трансляции rrrFer Общие вопросы C/C++ 10 06.09.2014 21:52
Обнуление глобальных переменных g11112 Общие вопросы Delphi 2 05.08.2013 16:35
два вопроса о глобальных переменных Ksardas13 Общие вопросы C/C++ 15 08.09.2012 10:31
Конфликт глобальных переменных RRt C/C++ Сетевое программирование 3 23.08.2012 22:51
Обнуление глобальных переменных в VBA Arkasha69 Microsoft Office Excel 1 06.09.2010 15:06