Форум программистов, компьютерный форум CyberForum.ru

Странный SIGSEGV, или что зависит от порядка написания интерфейса класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Описание класса определённого типа http://www.cyberforum.ru/cpp-beginners/thread106652.html
Доброго времени суток!!! Могули я описать класс определённого типа данных, например чтобы потом была возможна конструкция: MyClass object; int a = 1; object = a; Заранее спасибо!!!
C++ матрица помогите решить,пожалуйста... _________________________ дана действительная квадратная матрица С(n,n). найти максимальный элемент в главной диагонали и поменять местами соответствующие ему строку и столбец ______________________ заранее спасибо большое http://www.cyberforum.ru/cpp-beginners/thread106642.html
Функция fopen возвращает нулевой указатель (Visual Studio) C++
Здраствуйте) У меня возникла очень странная проблема.просто мистика. С чем может быть связано возвращение нулевого указателя в функции fopen.? Я пишу в винАПИ.По пока с новыми функциями не разобрался(для работы с файлами) Вот.И тут такое.Путь задан жестко.НО!она открывает его ИНОГДА, а чаще всего НУЛЛ возвращяет.Путь правильный.Потому,что по тому же пути из этого же фаила считывает инфу...
C++ найти max и min по длине слово
такая задача. помогите плиз _______________________________ дана строка символов. найти в ней max и min по длине слово и заменить их на подстроки "max" и "min" соответственно, при необходимости сдвинув символы ___ заранее спасибо
C++ Передача файлового потока в функцию http://www.cyberforum.ru/cpp-beginners/thread106631.html
Здрасти. ifstream in("1.txt"); что возвращает in? как передать этот поток (in) в функцию которая выводит символы? void readFile( ???????????? ){ char ch; while (in){
C++ В каждой строке двухмерного массива определить наибольший элемент и подсчитать сумму этих максимальных элементов В каждой строке двухмерного массива определить наибольший элемент и подсчитать сумму этих максимальных элементов. подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17472 / 5710 / 363
Регистрация: 30.03.2009
Сообщений: 15,683
Записей в блоге: 26
22.03.2010, 14:39     Странный SIGSEGV, или что зависит от порядка написания интерфейса класса
Короткий пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
 
class Variable
{
  private:
#if 1
    bool is_shared;
    std::string var_name;
#else
    std::string var_name;
    bool is_shared;
#endif
 
  public:
    Variable (const std::string name);
};
 
Variable::Variable (const std::string name)
  : var_name (name),
    is_shared (false)
{
}
Код
$ g++ -c -Wall t.cc
t.cc: In constructor 'Variable::Variable(std::string)':
t.cc:8: warning: 'Variable::var_name' will be initialized after
t.cc:7: warning:   'bool Variable::is_shared'
t.cc:18: warning:   when initialized here
Если заменить "#if 1" на "#if 0", то warning'а не будет. Теперь надо думать, что сие означает

У меня проявляется на gcc-3.4.6 и gcc-4.1.2

Добавлено через 1 час 25 минут
Вот чего мне умные люди сказали:

короче, там такая фишка
если у тебя в конструкторе инициализация данных происходит строго по очереди, то даже если ты ошибся где-то, и поле налазит на какое-то другое поле, ты не перепишешь чужих данных
к примеру, если у тебя структура данных что-то вроде
{int a[5], int b[7]}
а ты записываешь в "a" вместо 5 интов, к примеру, 8, тогда, если ты инициализируешь поля:
1.b 2.a -> ты затрешь данные, которые хранятся в "b"
1.a 2.b -> у тебя b будет корректно, а в "a" будет хранится 5 интов (из 8)
Это считается правильным не только с точки зрения "контроль за собственными ошибками", но и с точки зрения взлома. К примеру, если у тебя
{char b[10], int *ddd}, злоумышленники, как-нибудь взломав код, и передав в "b" на 4 char-а больше смогут контролировать и поле "ddd"
вроде так, если я не ошибаюсь

когда они (gcc-шники) поняли, что иногда инициализация в некорректном виде может привести к проблемам, они не стали заморачиваться, а теперь выдают предупреждение при _любых_ инициализациях в не том порядке, в котором они были объявлены
т.е. не зависит от типов, хоть два bool сделай
-Wno-reorder - поможет избавиться
Сентенция вытекает такая, что причина warning'а понятна, но это НЕ объясняет выпадение в кору. Там какая-то другая причина
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru