[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: How far should one go preventing potential memory leaks?
- From: Paco Zamora-Martínez <pakozm@...>
- Date: Mon, 09 May 2016 07:56:03 +0000
You would need to capture Lua errors using lua_pcall instead of directly calling lua_pushstring. Once you capture the error, you ensure all memory resources are properly deallocated and you can throw a Lua error by your own.
We were suffering a similar problem, and at the end we solved it by going to C++ and using wrappers which automatically call Lua functions, capture the error and throw a C++ exception. Once the exception is captured, the Lua error is generated in a safe way.
On Mon, 9 May 2016 at 09:38 Marc Balmer <firstname.lastname@example.org
I would like to open a discussion on best practices for preventing memory leaks in C programs using the Lua API.
Consider the following code snippet:
char *s = malloc(32);
snprintf(s, 32, "bumblebee");
lua_pushstring() could raise an error (e.g. under memory pressure) and then the subsequent free(s) would not be called, leaking the memory.
One could use lua_newuserdata() instead of malloc, but this works only if the memory is allocated by our own code, it does not work where the memory is allocated e.g. by a third party library.
So a possible way could be to create a metatable containing a __gc method, then allocating a small userdata value containging only a pointer to the allocated data. The __gc method could then free the memory, even if lua_pushstring() fails.
Is it worth the effort? How do others (you) handle this kind of possible errors?
My personal take on this is, btw: I don't care as I long as I don't reference NULL pointers. If we are under memory pressure and functions like lua_pushstring() are starting to fail, we will be in much deeper trouble anyway soon... ymmv, opinions very welcome.