Одна ошибка с alloca
заключается в том, что longjmp
перематывает ее назад.
То есть, если вы сохраняете контекст с setjmp
, тогда alloca
некоторое количество памяти, тогда longjmp
в контексте вы можете потерять память alloca
(без какого-либо уведомления). Указатель стека возвращается туда, где он был, и поэтому память больше не сохраняется; если вы вызываете функцию или выполняете другую alloca
, вы будете clobber оригинала alloca
.
Кстати, это обеспечивает правдоподобный механизм преднамеренного освобождения памяти, который был выделен с помощью alloca
.
Это нигде не документировано; конечно, описание ISO C setjmp
ничего не говорит о взаимодействиях с alloca
, так как не описывает такую функцию. Реализации, которые предоставляют alloca
, также не документируют это.
Фокус обычно заключается в том, что память alloca
связана с активацией функции , а не с каким-либо блоком ; что несколько вызовов alloca
просто захватывают больше памяти стека, которые все освобождаются при завершении функции. Не так; память фактически связана с контекстом процедуры. Когда контекст восстанавливается с помощью longjmp
, так же, как и предыдущее состояние alloca
.
Я столкнулся с этим, что я знаю.
Вы не сказали scatter
использовать цветовые данные из вашего источника данных:
p.scatter(x='x', y='y', fill_color='fill_color', source=source)