Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Application made attempt to free the same memory block twice  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
Всем доброго дня. Имеется такой код:

procedure TRVMarkTextPainter.EnumItemsAdd(RVData: TCustomRVData; ItemNo: integer; var UserData1: integer;
 const UserData2: string; var ContinueEnum: boolean);
var
 s: string;
 pc, pcfound: PChar;
begin
 if RVData.GetItemStyle(ItemNo) < 0 then
  Exit;
 s  := RVData.GetItemText(ItemNo);
 pc := PChar(s);
 pcfound := SearchBuf(pc, System.Length(s), 0, 0, UserData2, [soDown, soWholeWord]);
 while pcfound <> nil do
 begin
  AddRectMark(RVData, ItemNo, pcfound - pc + 1, System.Length(UserData2), TColor(UserData1));
  pcfound := SearchBuf(pcfound + System.Length(UserData2), System.Length(s), 0, 0, UserData2, [soDown, soWholeWord]);
 end;
 ContinueEnum := True;
end;


Периодически валится на первой строке pcfound := SearchBuf с ошибкой попытки двойного разрушения буфера строки: EDoubleFreeError Application made attempt to free the same memory block twice: $1936BA50 STRING [?] 24 bytes. Ошибку находит эврикалог, ошибка в обвязке TRichEdit'а. Код, насколько я знаю, выполняется в дополнительном потоке. Сложно сказать как насчет реентабельности (возможно потоки дерутся между собой), но вроде бы противопоказаний по коду не вижу. Вопросов традиционно два: кто виноват и что делать?
5 дек 17, 10:26    [21006326]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
Маловероятно, что ошибка на стороне Delphi, но, на всякий случай, версия XE6.
5 дек 17, 10:28    [21006334]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
DesWind
Member

Откуда:
Сообщений: 66
makhaon,


Попробуй убрать const у UserData2, тогда строка скопируется и будет полностью локальной переменной. Тем более, что это дополнительный поток.
5 дек 17, 11:18    [21006558]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
fd00ch
Member

Откуда: Нижний Новгород
Сообщений: 5864
в качестве костылей можно UniqueString попробовать
5 дек 17, 12:29    [21006839]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43932

makhaon
кто виноват и что делать?

Я бы очень внимательно смотрел на RVData.GetItemText(), поскольку сдаётся мне, что оно
возвращает какую-то фигню.

Posted via ActualForum NNTP Server 1.5

5 дек 17, 12:56    [21006931]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
const, к сожалению, не могу убрать, потому как это колл-бэк в компоненте. а вот UniqueString попробую, спасибо.
5 дек 17, 13:10    [21006994]     Ответить | Цитировать Сообщить модератору
 Re: Application made attempt to free the same memory block twice  [new]
GunSmoker
Member

Откуда:
Сообщений: 2929
makhaon, включи детект утечек памяти. При включенных утечках у блоков памяти появляется дополнительная инфа. Среди прочего там будет стек предыдущей операции.
5 дек 17, 14:10    [21007318]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить