![]() |
|
Модераторы: bsa |
![]()
|
|
| fuckingniger |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ошибка такова
вот код: m_string.h
m_string.cpp
main
собственно вопрос вот в чём.Если в string.cpp поменять
на
то всё чудно работает - конструктор преобразования работает как надо ... но всё так не понимаю почему так неправильно - объясните плз почему. |
||||||||||
|
|||||||||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
статические переменные инициализируются при первом входе в их область видимости. Другими словами, в твоем случае она инициализируется при первом входе в метод operator(). Причем, возможно аж до того, как s будет выделена память.
Кстати, твой код вообще какой-то странный. У тебя утечка памяти. Чтобы ее не было, перепиши так:
Чтобы не было утечек памяти тебе необходимо так же реализовать конструктор копирования и оператор присваивания. Так как оператор присваивания лучше всего реализуется через метод swap (m_string(param).swap(*this); return *this;) - обмен содержимым двух объектов, то рекомендую сначала сделать его. |
||||||
|
|||||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
это тестовая программа просто ради конструктора преобразования(посмотреть с чем его едят) - поэтому и не написал конструкторы копии и прочее
а в чём утечка памяти то? и всё таки очень интересно что значит этот BLOCK_TYPE...... у меня какая -то обще методическая ошибка как я понимаю.......... Добавлено через 7 минут и 52 секунды
а как это работает? ни встречал пока такой формы |
|||
|
||||
| Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
||||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
аа...понял но эта ошибка не в утечке....
|
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
неужели никто не знает?!
Это сообщение отредактировал(а) fuckingniger - 11.10.2010, 16:13 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
fuckingniger, я уже написал в чем ошибка. В том, что статическая переменная инициализируется чем-то непонятным, лежащим в s. Так как это происходит ДО выполнения тела функции, в которой она объявлена.
|
|||
|
||||
| fuckingniger |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ну эта ошибка меня убивает просто ...
переписал функцию operator+ как глобальную (как друг класса) чтоб можно было вызывать в любом порядке и опять та же ошибка хотя старую (operator() )я не вызываю привожу код заново чтоб всё ясно было m_string.h
m_string.cpp
main.cpp
ошибка та же самая... |
||||||
|
|||||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
создается новый объект типа m_string путем вызова подходящего по параметрам конструктора. Можно даже писать:
Добавлено через 1 минуту и 12 секунд
|
||||
|
|||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
ну я дебагом просто проходил и всё нормально инициализируется
|
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Вы не сделали конструктор копирования. При этом может быть вы и не замечаете, но у вас создаются копии строк тут:
Компилятор сам делает конструктор копирования, просто присваивая поля объектов друг другу. Таким образом вы имеете несколько указателей на одну и ту же область данных и несколько раз ее освобождаете. То, что без static работает, можно отнести на оптимизацию компилятора (или даже фичу языка - тут не возьмусь утверждать), когда он "проталкивает" возвращаемую переменную из функции наружу - со static, очевидно, так сделать нельзя - чтобы внешний код не повредил статичные данные функции. Попробуйте сделать m_string& operator()(int). Добавлено @ 16:42 bsa, вы не правы, по-моему. Бабах происходит из-за дабл фрии. Добавлено через 7 минут и 1 секунду fuckingniger, >ну я дебагом просто проходил и всё нормально инициализируется Да там и без дебага понятно, что инициализируется нормально. static-данные инициализируеются не просто при входе в зону видимости, а когда до них черед выполнения доходит. Это сообщение отредактировал(а) djamshud - 11.10.2010, 16:46 -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
djamshud
по ходу да ...ща попробую ...забыл что при возвращении по значению вызывается конструктор копии(хоть и узнал это часов 30 назад всего!) |
|||
|
||||
| djamshud |
|
||||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Да, с оптимизациями и фичами я прогнал.
Тут просто указатель s преобразуется в один объект m_string, после чего благополучно уничтожится. Это все равно что сделать так:
Тут как раз наглядно видно, как "протолкнется" объект. А так
опять все сдохнет. Это сообщение отредактировал(а) djamshud - 11.10.2010, 17:02 -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||||
|
|||||||
| Crafty |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
Конструктор копий:
Оператор+
Теперь вроде работает. |
||||
|
|||||
| fuckingniger |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 1.10.2010 Репутация: нет Всего: 1 |
не совсем понял эту фразу....А так спасибо большое - после написания конструктора копии всё запахало как надо Добавлено через 2 минуты и 31 секунду
сдохнет из=за того что конструктор присваивания по умолчанию просто скопирует указатели(они будут указывать на 1 динамически выделенную память?) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |