<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Ошибка при освобождении памяти строк(LUA C API)]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Ошибка при освобождении памяти строк(LUA C API) форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 18:22:14 +0300</pubDate>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32439/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_sCIzoMwJ" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Это рекомендация стандарта С++ 2003 года, что надо помечать переменные, которые не меняются const, так же как const функции.<br />=============<br />Создаётся впечатление, что вы просто не можете объяснить, зачем поставили это ключевое слово в свой код. В итоге, ссылаетесь на некие рекомендации. Даже я уже для себя увидел, одну из причин, зачем оно там нужно, но вот всё-таки хотелось бы автора услышать... ну да ладно.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_ggAhljJl" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Чем владеть я сам разберусь, мне так удобнее, читаемость не меняется.<br />=============<br />Разумеется. Это лишь советы и мнения, как и на любом форуме. Тем не менее, своё мнение я высказал, и не меняю его. В вашем коде auto затрудняет читаемость и ничего не даёт взамен. Если вы считаете, что для вас наоборот, читаемость повышается, ну что ж, значит у вас такое восприятие кода...<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_QG7diBQk" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Разве где-то я смешиваю new/delete и new&#91;&#93;/delete&#91;&#93; между собой?<br />=============<br />Ну, если вы вызываете «delete&#91;&#93; p», и этот p объявлен типом «xxx *», то да, с синтаксической точки зрения. Потому что «delete&#91;&#93; p» можно делать только для p объявленным как «xxx &#91;&#93;». Я могу даже вам привести пример коротенькой программы, где такое использование delete&#91;&#93; p приводит к зацикливанию и подвисанию кода. Если хотите. Тем не менее, в вашем случае, с примитивными типами (char, int и т.д.), это сработает. И вызов delete&#91;&#93; отработает для char * также как и для «char &#91;&#93;», как впрочем и вызов просто delete, также освободит всю память без утечек для char &#91;&#93;. Это только для базовых примитивных типов delete и delete&#91;&#93; равносильны, хотя с точки зрения синтаксиса и идеологии C++ это неправильно. Я даже затрудняюсь сказать, насколько это «specific behavior» и насколько противоречит каким версиям стандарта C++, это нужно глубоко ковырять все ревизии, но тем не менее. Это вообще проблема языка, что он не может возвращать массивы из ф-ций, для этой цели сделали даже std::array шаблон для массивов, который оборачивает их в структуру, и их можно возвращать из ф-ций. То-есть, тема более глубокая и сложная. Но суть я сказал в начале...<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_d9YfQPt8" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Разве в большинстве компиляторов C++ delete реализован не через free и отличие лишь в том, что delete запускает дескруктор?<br />=============<br />Отличие там в дополнительных полях, за пределами массива, куда delete и delete&#91;&#93; лезут, чтобы узнать сколько и чего им удалять. Если вы им подсунете указатель из malloc'а, то это приведёт к ошибке выхода за пределы массива в общем случае. Да и вообще, сами malloc и free реализованы через системные ф-ции типа HeapAlloc, HeapFree и т.д. Как и new и delete. Это разные группы ф-ций работы с памятью, со своими структурами, и вызывать ф-ции одной группы для обработки памяти выделенной из другой просто бессмысленно. <br />
			<i>29.07.2018 00:01:38, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32439/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32439/topic3832/</guid>
			<pubDate>Sun, 29 Jul 2018 00:01:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32434/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_a10M4dxj" href="/user/2600/" bx-tooltip-user-id="2600">Andrei2016</a> написал:<br />Скорее всего, ошибка идет из-за const auto firmid. Попробуйте поставить const char *firmid. Либо прямо указать &nbsp;delete (char*)firmid.<br />Не совсем понял, зачем вам удалять по delete объект, который вы по new не создавали. Фактически, вы хотите удалить объект, созданный &nbsp;через Lua C API? Там же могут быть какие-то еще перекрестные связи, которые вы не отслеживаете.<br />Кстати, зачем вам вообще удалять firmid? Вы поставили спецификацию const, она в любом случае для этой переменной, не создаваемой по new разместит при работе компилятора firmid либо в стеке, либо в статическом локальном секторе кода программы. Уберите delete&#91;&#93; firmid вообще.<br />=============<br />Спасибо. Уже разобрался с пароблемой, ничего подчищать не надо. Сборщик мусора Lua сам там подчищает. Насчет замены const auto на &nbsp;const char * это ничего не даст, компилятор не настолько глупый, он понимает что тип там char * и сам заменит запись на const char *. Просто меньше буков в записи - тратится меньше времени на написание кода. <br />
			<i>28.07.2018 16:08:03, null.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32434/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32434/topic3832/</guid>
			<pubDate>Sat, 28 Jul 2018 16:08:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32431/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Скорее всего, ошибка идет из-за const auto firmid. Попробуйте поставить const char *firmid. Либо прямо указать &nbsp;delete (char*)firmid.<br />Не совсем понял, зачем вам удалять по delete объект, который вы по new не создавали. Фактически, вы хотите удалить объект, созданный &nbsp;через Lua C API? Там же могут быть какие-то еще перекрестные связи, которые вы не отслеживаете.<br />Кстати, зачем вам вообще удалять firmid? Вы поставили спецификацию const, она в любом случае для этой переменной, не создаваемой по new разместит при работе компилятора firmid либо в стеке, либо в статическом локальном секторе кода программы. Уберите delete[] firmid вообще. <br />
			<i>28.07.2018 15:23:36, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32431/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32431/topic3832/</guid>
			<pubDate>Sat, 28 Jul 2018 15:23:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32430/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_FmpHk9wx" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br /><br />====quote====<br /> null &nbsp; написал:<br />const позволяет компилятору оптимизировать лучше код.<br />=============<br />Что вы там оптимизируете? можете объяснить? или вы где-то что-то прочитали и теперь лепите этот const куда ни попади...<br /><br />====quote====<br /> null &nbsp; написал:<br />Чем вам C++ 11 не угодил? Синтаксический сахар, очень удобен, особенно когда тип переменной очень длинный, очень облегчает читаемость кода, компилятор сам подставит нужный тип.<br />=============<br />Вы сначала классическим способом овладейте написания программ на Си/Си++, а потом уже за сахар новый хватайтесь. Ошибки типизации это бич для новичка. А всякие auto только способствуют этому. И читаемость программы падает, когда вы не видите типа. Для того чтобы повысить читаемость, наоборот, эти типы даже в префиксах переменных нотируют.<br /><br />====quote====<br /> null &nbsp; написал:<br />Это с каких пор надо освобождать через delete?<br />=============<br />С момента написания Страуструпом своей первой книги. Там, если не ошибаюсь, целая глава есть посвящённая вопросу, почему нельзя смешивать вызовы new/delete и new&#91;&#93;/delete&#91;&#93; между собой и чем это грозит. Вообще, масса тем в сети по этому поводу. Помимо того что это плохой стиль, это вообще «undefined behaviour» в общем случае.<br /><br />====quote====<br /> null &nbsp; написал:<br />так как по адресу указателя, или после хранится размерность<br />=============<br />никогда, как раз для этого и введён delete&#91;&#93;, чтобы этого не делать и оставить совместимость по структуре памяти с чистым Си<br /><br />====quote====<br /> null &nbsp; написал:<br />Просто delete c char * у вас оставит утечку памяти.<br />=============<br />Я писал про то, что «char *» это просто указатель на какую-то память, которая пришла из недр lua_tostring. Вместо «char *» могло быть объявлено как «void *». Под «char *» часто (стандартная практика) имеется ввиду просто указатель на память и всё. А не то, что там кто-то выделял массив через new char&#91;&#93;. Вот про что речь шла. Какая-то неизвестная ф-ция, вернула вам память неизвестного происхождения, и вы её зафигачили delete&#91;&#93; увидев, что указатель на эту память объявлен типом «char *». Понимаете суть своей ошибки?... более того, внутри lua_tostring по определению не может быть никакого new char&#91;&#93;, так как она написана на чистом Си, как и вся Lua! Исходники Lua посмотрите. Там эта память через malloc выделяется, а вы её в delete&#91;&#93; засунули. Так вообще делать нельзя, это уже системная ошибка освобождения памяти выделенной разными библиотеками. Поэтому она вам «Unknown error. Possible unhandled exception.» и выдала... осознаёте суть происходящего?<br />=============<br />Это рекомендация стандарта С++ 2003 года, что надо помечать переменные, которые не меняются const, так же как const функции. Чем владеть я сам разберусь, мне так удобнее, читаемость не меняется. Разве где-то я смешиваю new/delete и new&#91;&#93;/delete&#91;&#93; между собой? Разве в большинстве компиляторов C++ delete реализован не через free и отличие лишь в том, что delete запускает дескруктор? <br />
			<i>28.07.2018 14:24:52, null.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32430/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32430/topic3832/</guid>
			<pubDate>Sat, 28 Jul 2018 14:24:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32420/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_tPngAtit" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />const позволяет компилятору оптимизировать лучше код.<br />=============<br />Что вы там оптимизируете? можете объяснить? или вы где-то что-то прочитали и теперь лепите этот const куда ни попади...<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_pIK0gN2J" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Чем вам C++ 11 не угодил? Синтаксический сахар, очень удобен, особенно когда тип переменной очень длинный, очень облегчает читаемость кода, компилятор сам подставит нужный тип.<br />=============<br />Вы сначала классическим способом овладейте написания программ на Си/Си++, а потом уже за сахар новый хватайтесь. Ошибки типизации это бич для новичка. А всякие auto только способствуют этому. И читаемость программы падает, когда вы не видите типа. Для того чтобы повысить читаемость, наоборот, эти типы даже в префиксах переменных нотируют.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_U9FazfZB" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Это с каких пор надо освобождать через delete?<br />=============<br />С момента написания Страуструпом своей первой книги. Там, если не ошибаюсь, целая глава есть посвящённая вопросу, почему нельзя смешивать вызовы new/delete и new&#91;&#93;/delete&#91;&#93; между собой и чем это грозит. Вообще, масса тем в сети по этому поводу. Помимо того что это плохой стиль, это вообще «undefined behaviour» в общем случае.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_3RYMgy2S" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />так как по адресу указателя, или после хранится размерность<br />=============<br />никогда, как раз для этого и введён delete&#91;&#93;, чтобы этого не делать и оставить совместимость по структуре памяти с чистым Си<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_4gjlYVwy" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Просто delete c char * у вас оставит утечку памяти.<br />=============<br />Я писал про то, что «char *» это просто указатель на какую-то память, которая пришла из недр lua_tostring. Вместо «char *» могло быть объявлено как «void *». Под «char *» часто (стандартная практика) имеется ввиду просто указатель на память и всё. А не то, что там кто-то выделял массив через new char&#91;&#93;. Вот про что речь шла. Какая-то неизвестная ф-ция, вернула вам память неизвестного происхождения, и вы её зафигачили delete&#91;&#93; увидев, что указатель на эту память объявлен типом «char *». Понимаете суть своей ошибки?... более того, внутри lua_tostring по определению не может быть никакого new char&#91;&#93;, так как она написана на чистом Си, как и вся Lua! Исходники Lua посмотрите. Там эта память через malloc выделяется, а вы её в delete&#91;&#93; засунули. Так вообще делать нельзя, это уже системная ошибка освобождения памяти выделенной разными библиотеками. Поэтому она вам «Unknown error. Possible unhandled exception.» и выдала... осознаёте суть происходящего? <br />
			<i>27.07.2018 23:36:40, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32420/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32420/topic3832/</guid>
			<pubDate>Fri, 27 Jul 2018 23:36:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32418/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_MiFLFtBU" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br /><br />====quote====<br /> null &nbsp; написал:<br />Что не так и как правильно освободить память?<br />=============<br />Всё не так...<br />1. lua_tostring просто конвертирует элемент на стеке в строку, но эта строка остаётся в рамках памяти сборщика мусора, и после следующего вызова lua_pop попадает в мусор. Между вызовами lua_tostring и lua_pop необходимо выделить память и скопировать туда содержимое строки, если следовать логике вашего кода.<br />2. операция «delete&#91;&#93; firmid» вообще не имеет смысла по трём причинам: Во-первых потому что как уже выше сказал, lua_tostring возвращает указатель на внутреннюю память освобождаемую сборщиком мусора, во-вторых, потому что у вас в условии, при lua_isnil == true вообще вернётся указатель на константную строку, которую нельзя освобождать через delete, а в-третьих, потому что строку «char *» вообще нельзя освобождать через delete&#91;&#93;, так как это не массив «char &#91;&#93;», а такие строки выделенные внутри ф-ций, если их и нужно освобождать, то нужно просто через delete.<br />3. И что это за «const auto»? зачем вам «const»? И «auto» (новодельный С++11) вы тоже зря засунули, пишите честно типы и тогда не будет путаницы с типами и delete и пр...<br />=============<br />Так и думал, что там сборщик мусора. const позволяет компилятору оптимизировать лучше код. Чем вам C++ 11 не угодил? Синтаксический сахар, очень удобен, особенно когда тип переменной очень длинный, очень облегчает читаемость кода, компилятор сам подставит нужный тип. &quot;а в-третьих, потому что строку «char *» вообще нельзя освобождать через &nbsp;delete&#91;&#93;, так как это не массив «char &#91;&#93;», а такие строки выделенные &nbsp;внутри ф-ций, если их и нужно освобождать, то нужно просто через delete.&quot; Это с каких пор надо освобождать через delete? delete&#91;&#93; если не ошибаюсь сам определяет размерность, так как по адресу указателя, или после хранится размерность, уже не помню все тонкости хранения данных в памяти. Просто delete c char * у вас оставит утечку памяти. <br />
			<i>27.07.2018 21:25:50, null.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32418/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32418/topic3832/</guid>
			<pubDate>Fri, 27 Jul 2018 21:25:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32417/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_s7orReu5" href="/user/12210/" bx-tooltip-user-id="12210">null</a> написал:<br />Что не так и как правильно освободить память?<br />=============<br />Всё не так...<br />1. lua_tostring просто конвертирует элемент на стеке в строку, но эта строка остаётся в рамках памяти сборщика мусора, и после следующего вызова lua_pop попадает в мусор. Между вызовами lua_tostring и lua_pop необходимо выделить память и скопировать туда содержимое строки, если следовать логике вашего кода.<br />2. операция «delete&#91;&#93; firmid» вообще не имеет смысла по трём причинам: Во-первых потому что как уже выше сказал, lua_tostring возвращает указатель на внутреннюю память освобождаемую сборщиком мусора, во-вторых, потому что у вас в условии, при lua_isnil == true вообще вернётся указатель на константную строку, которую нельзя освобождать через delete, а в-третьих, потому что строку «char *» вообще нельзя освобождать через delete&#91;&#93;, так как это не массив «char &#91;&#93;», а такие строки выделенные внутри ф-ций, если их и нужно освобождать, то нужно просто через delete.<br />3. И что это за «const auto»? зачем вам «const»? И «auto» (новодельный С++11) вы тоже зря засунули, пишите честно типы и тогда не будет путаницы с типами и delete и пр... <br />
			<i>27.07.2018 21:14:10, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32417/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32417/topic3832/</guid>
			<pubDate>Fri, 27 Jul 2018 21:14:10 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка при освобождении памяти строк(LUA C API)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message32403/topic3832/">Ошибка при освобождении памяти строк(LUA C API)</a></b> <i>Unknown error. Possible unhandled exception.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Столкнулся с проблемой, что не освобождается памяти от строк, которые вернулись lua_tostring. Если не удалять, то появляется утечка памяти. Что не так и как правильно освободить память?<br /><br /><br /><br />
====code====
<pre>const char *getStringField(lua_State* state, const char* field)
{

&nbsp;&nbsp;&nbsp;lua_getfield(state, -1, field);
&nbsp;&nbsp;&nbsp;// lua_pushstring(state, field);
&nbsp;&nbsp;&nbsp;// lua_gettable(state, -2);

&nbsp;&nbsp;&nbsp;const auto result = lua_isnil(state, -1) ? "" : lua_tostring(state, -1);
&nbsp;&nbsp;&nbsp;lua_pop(state, 1);

&nbsp;&nbsp;&nbsp;return result;
}

const auto firmid = getStringField(state, "firmid");

delete&#91;&#93; firmid; // Бабах ошибка Unknown error. Possible unhandled exception.

</pre>
============= <br />
			<i>27.07.2018 10:34:04, null.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message32403/topic3832/</link>
			<guid>http://forum.quik.ru/messages/forum10/message32403/topic3832/</guid>
			<pubDate>Fri, 27 Jul 2018 10:34:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
