1

我正在编写一个小型Lua绑定库。目前我提供了一个非常简单的结构来保存键/值,其中 myvalue是一个void pointer.

struct kvPair {
       enum EVENT_TYPE type;
       char *key;
       void *value;
   };

typedef struct kvPair KeyValuePair;

KeyValuePair kvPairWithNumber(char *key, float number)
{
    KeyValuePair kv;
    float *aux = malloc(sizeof(float)); // <-- help
    *aux = number;
    kv.key = key;
    kv.type = NUMBER;
    kv.value = aux;
    return kv;
}

我想知道这种用例......什么是处理 malloc 的好方法?我真的不想这样做:

if (aux == NULL) {
    exit(0);
}

也许我可以预先分配一块内存,并用我自己更简单的实现覆盖 malloc 调用(使用简单堆栈的自定义内存分配器?)

想收到反馈和例子,简单是首选。

4

1 回答 1

1

你绝对不想退出。任何脚本或扩展都不应该使整个解释器崩溃。

基本上有两种表达错误的方法。第一种方法是使用C API 提供的lua_errorluaL_error 。第二种方法更多的是一种策略:返回nil和错误消息(通常与 结合使用assert)。

您正在用 C 编写扩展程序,因此您基本上只能通过返回码来处理 C 风格的错误。您很可能需要更改您的函数签名以支持这一点。

int kvPairWithNumber(KeyValuePair * kv, char *key, float number)
{
    float *aux = malloc(sizeof(float));
    if (aux == NULL) {
        return 0;
        // note: you could instead just put lua_error here
    }
    *aux = number;
    kv->key = key;
    kv->type = NUMBER;
    kv->value = aux;
    return 1;
}

然后您可以处理 Lua 函数中的错误:

int my_lua_function(lua_State * L)
{
    KeyValuePair kv = {0};

    // first method:
    if (!kvPairWithNumber(&kv, "asdf", 1.0)) {
        luaL_error(L, "could not create pair!");
    }

    // second method:
    if (!kvPairWithNumber(&kv, "asdf", 1.0)) {
        lua_pushnil(L);
        lua_pushstring(L, "could not create a pair!");
        return 2;
    }
}

使用您的扩展的 Lua 代码如下所示:

-- first method:
local result = xpcall(my_lua_function, error_handler)

-- note: if you need to pass args, you will need a closure
local result = xpcall(function() my_lua_function(x, y, z) end, error_handler)

-- second method:
local result = assert(my_lua_function())
于 2013-01-14T04:23:55.043 回答