powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
16 сообщений из 16, страница 1 из 1
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40079976
Собрал в Debian Linux программу Bonzomatic из git-репозитария https://github.com/Gargaj/Bonzomatic

Если ее запустить, переключиться на русскую раскладку, и нажать любую русскую букву, то произойдет сегфолт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
*** Error in `./bonzomatic': free(): invalid next size (fast): 0x000056048520f980 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x70bfb)[0x7fa3c7f6ebfb]
/lib/x86_64-linux-gnu/libc.so.6(+0x76fc6)[0x7fa3c7f74fc6]
/lib/x86_64-linux-gnu/libc.so.6(+0x7780e)[0x7fa3c7f7580e]
./bonzomatic(_ZN9Scintilla10LineLayout4FreeEv+0x7b)[0x56048373ba39]
./bonzomatic(_ZN9Scintilla10LineLayoutD2Ev+0x26)[0x56048373b8ea]
./bonzomatic(_ZN9Scintilla10LineLayoutD0Ev+0x18)[0x56048373b906]
./bonzomatic(_ZN9Scintilla15LineLayoutCache8RetrieveEiiiiii+0x21c)[0x56048373c920]
./bonzomatic(_ZN9Scintilla8EditView18RetrieveLineLayoutEiRKNS_9EditModelE+0x143)[0x56048372377f]
./bonzomatic(_ZN9Scintilla6Editor11WrapOneLineEPNS_7SurfaceEi+0x30)[0x560483702c9c]
./bonzomatic(_ZN9Scintilla6Editor9WrapLinesENS0_9wrapScopeE+0x487)[0x56048370323f]
./bonzomatic(_ZN9Scintilla6Editor5PaintEPNS_7SurfaceENS_10PRectangleE+0x10e)[0x560483703e88]
./bonzomatic(_ZN12ShaderEditor5PaintEv+0xa5)[0x56048363edc5]
./bonzomatic(main+0x463e)[0x56048364641e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1)[0x7fa3c7f1e2e1]
./bonzomatic(_start+0x2a)[0x56048362adaa]
======= Memory map: ========



В этой программе есть простейший тип:

Код: plaintext
1.
typedef float XYPOSITION;



И у класса LineLayout есть публичное свойство, в виде указателя на этот тип:

Код: plaintext
1.
2.
3.
4.
5.
class LineLayout {
  ...
  XYPOSITION *positions;
  ...
}



И вот с этим свойством в дебаггере творится лютая дичь: у него меняется тип. В конструкторе у этой переменной тип правильный, такой, какой объявлен в заголовке. А в деструкторе у этой же переменной тип становится "простым", то есть без указателя. Я специально сделал GIF-анимацию из двух скриншотов:

Картинка с GIF-анимацией

То есть, даже до сегфолта, если поставить брекпоинт в конструктор и деструктор, будет постоянно наблюдатся вот это странное изменени типа.

Ну и дальше, сегфолт появляется на строчке:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void LineLayout::Free() {
    delete []chars;
    chars = 0;
    delete []styles;
    styles = 0;
    delete []positions; // <-- Тут сегфолт
    positions = 0;
    delete []lineStarts;
    lineStarts = 0;
}



Примечательно, что во время сегфолта, если просмотреть скоуп сегфолта, то у переменных chars, styles, lineStarts тип остается тем же, а у positions - слетает.

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

Поможите пофиксить этот баг.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40079980
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрации,

Отладчик может глючить.

Предлагаю сделать поиск по positions и поставить точки останова везде где написано delete positions.
Возможно этот указатель не везде зануляется после освобождения. А если приложение многопоточное,
то это вообще другой разговор.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40079983
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрации,

Ещё конечно можно подумать, что где-то вы написали:
Код: plaintext
1.
positions = new XYPOSITION();


А в деструкторе у вас так:
Код: plaintext
1.
delete []positions;


Это вроде не по стандарту, но это фашизм, конечно.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40079988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрацииПоможите пофиксить этот баг.

valgrind тебе в руки, это явно порча памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40079992
petrav, во всем коде только два динамических создания массивов, в файле PositionCache.cxx:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Extra position allocated as sometimes the Windows
// GetTextExtentExPoint API writes an extra element.
positions = new XYPOSITION[maxLineLength_ + 1 + 1];

...

positions = new XYPOSITION[len + (len / 4) + 1];



То бишь, создаются именно массивы.

Видимо, какой-то странный выход за границу массива.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080000
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй собрать с -fno-strict-aliasing
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080130
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двойное освобождение очень часто встречается, когда есть деструктор, освобождающий ресурсы, но нет или неверно реализован конструктор копирования (он должен создавать клоны ресурсов, а не просто копировать указатели, как происходит по умолчанию)

ЗЫ. А то что отладчик какие-то там типы неправильно показывает это скорее всего баг самого отладчика.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080154
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что за форма регистрации
Код: plaintext
1.
  XYPOSITION *positions;


Также посмотри по коду, как инициализируется переменная positions. Одно дело, когда
Код: plaintext
1.
positions  = new XYPOSITION ...


другое - инициализация указателем на локальную переменную, которая самоубилась при выходе из области видимости:
Код: plaintext
1.
2.
3.
4.
{
  XYPOSITION val;
  positions  = &val;
}
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080185
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрации,
Это как вы так схимичили урл, что сам хост работает, а картинка ваша в блоке по федеральному закону?
))))
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080186
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно зачем прятать ссылку скриншота за данным сайтом...
Ничего не понимаю.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080189
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты вообще смотришь скриншоты? Если человек не может скопипастить текст - то и на ксрине
не будет ничего интересного по определению.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080200
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Ну дак сутки не смотрел))).
Ну и надо читать газетысмотреть ссылки с новостями иногда.
))
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080221
PetroNotC Sharp, вот прямой URL, просто предыдущий форум, где я задавал такой же вопрос, не давал ввести длинные урлы, а я оттуда копипастил:

https://i.piccy.info/i9/c3ec4ba1f5a8441bf45a677128f12cce/1624553843/359024/1433897/bonzomatic.gif
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080224
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрации,
Отгадка оказалась простой.
А я был в недоумении))
Ну и непонятно, почему движок форума вдруг не глотал совсем недлинный урл?
Гугл поиск подлиннее будет.
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080226
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за форма регистрации,
По теме ты согласен с профи выше что причина - некорректная работа с памятью?
Ну и по сегфолту мое имхо что отладчик надо стопить до сегфолта. После него дичь может быть где угодно.
Имхо.
Зы.
Используй умные указатели)
...
Рейтинг: 0 / 0
Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
    #40080234
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Используй умные указатели)

В данном случае нужен просто std::vector
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое изменение типа переменной в конструкторе и деструкторе - как это возможно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]