我正在尝试修改nodemcu lua file.list functon /app/modules/file.c 返回由换行符char分隔的大文件名字符串。目前它返回数组,并且非常消耗内存,而且我正在剥离文件大小。 这是我所做的(检查了其他函数如何返回字符串)
static int file_list( lua_State* L )
{
char temp[32];
unsigned st = luaL_optinteger( L, 1, 1 ); // start offset
unsigned tf = luaL_optinteger( L, 2, 100000 ); // how much files to list
tf=tf+st;
vfs_dir *dir;
if (dir = vfs_opendir("")) {
lua_newtable( L );
struct vfs_stat stat;
int i=1;
int ii=0;
while (vfs_readdir(dir, &stat) == VFS_RES_OK) {
if (i<st)
{
i++;
continue;
}
if (i>=tf)
{
break;
}
strcpy (temp,stat.name);
strcat (temp,"\n");
lua_pushstring( L, temp );
i++;
ii++;
}
vfs_closedir(dir);
return ii;
}
return 0;
}
它无法正常工作,如果我请求40个以上的文件(设备重新启动后一次),我将看到如下输出:
.... 3fff0d10 already freed 3fff11b8 already freed 3fff0cc8 already freed 3fff1f88 already freed .....
并重新启动设备,但是如果我请求30个文件,并且每次以30的步长增加它们,则设法一次获取400个文件。
=file.list(1,30)
=file.list(1,60)
=file.list(1,90)
以这种方式工作,如果我直接这样做:
=file.list(1,60)
它不起作用。还要注意的是,在函数完成后,内存已分配且未设置为空闲,但在同一命令执行后也不会重新分配,因此这不是内存泄漏,只是某些日期可能保留在堆栈中。