lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On 05/10/2016 09:42 AM, Marc Balmer wrote:
Am 10.05.2016 um 09:13 schrieb Thomas Jericke <tjericke@indel.ch>:

On 05/10/2016 09:10 AM, Thomas Jericke wrote:
On 05/10/2016 08:41 AM, Marc Balmer wrote:
This prevents a memory leak if lua_pushstring() raises an error, but I will end
up with a number of rather small allocations that are only used for a short
period of time.
If they buffers are really that small, I would just use the stack.

char s[32];
snprintf(s, sizeof(s), "bumblebee");
lua_pushstring(L, s);


PS. I swear I typed this before I saw Sean's answer :-/

Hehe ;)

Well, in the real code the allocations are made for user supplied parameters, so I don't
know neither the size of the parameters not their count (which can be up to 65535), so
I really need to allocate the memory.

However, many thanks to everyone who replied.


You can reuse the buffer and you can make a fall-back for large parameters.

char buff[1024];

for(unsigned long index = 0; index < 65535; index++) {
  size_t len = strlen(args[index]);
  if(len + 6 <= sizeof(buff)) {
    sprintf(buff, "arg1=%s", args[index]);
    lua_pushstring(L, buff);
  }
  else {
    char *s = lua_newuserdata(L, len + 6);
    sprintf(s, "bumblebee");
    lua_pushstring(L, s)
  }
}

Assuming you need the strlen anyway to know how large your buffer must be, it is only an additional "if". I think most of the time the additional "if" statement will pay off. If you want to be sure you can simply profile your parameter length.
--
Thomas