LuaBridge绑定字符串参数的函数失败

在LuaBridge中注册带有char* 作为参数的函数,会导致运行时的断言错误,例程如下:

 class A 
{
protected:
    char*   newname;
public:
    A(char* _name)
    {
        newname = _name;
    }

    std::string getName()
    {
        return this->name;
    }

    void printName()
    {
        printf("Hello, my name is %s!\n", this->newname);
    }
};

注册代码如下

 luabridge::getGlobalNamespace(L)
        .beginClass<A>("A")
                .addConstructor<void(*) (char *)>()
                .addFunction("getName", &A::getName)
                .addFunction("printName", &A::printName)
        .endClass();

在lua中的调用如下

 local b = A('moo')
b:printName()

然后运行时就会出现错误"assertion failed",如图所示
图片说明
此问题不仅出现在注册类的构造函数上,实际上,任何的试图注册带有char*类型的函数都会导致此错误,比如下面的代码

void UpdateMem(char* _mem)
{
    ...
    // manipulate the memory
}

请问有没有人遇见过这类问题,这样该如何解决传入指针,操作内存区的问题啊?
多谢!!

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

LuaBridge 在处理字符串参数时需要特殊注意,因为 Lua 中的字符串和 C++ 中的字符指针是不同的数据类型。在你的示例中,LuaBridge 尝试将 Lua 字符串传递给 C++ 函数,但这会导致错误。


为了正确处理字符串参数,你可以使用 std::string 类型而不是 char* 类型作为参数。这样可以避免处理指针的问题,并且能够更好地与 Lua 字符串进行交互。


以下是修改后的代码示例:

class A {
protected:
    std::string newname;
public:
    A(const std::string& _name) {
        newname = _name;
    }

    std::string getName() {
        return this->newname;
    }

    void printName() {
        printf("Hello, my name is %s!\n", this->newname.c_str());
    }
};

luabridge::getGlobalNamespace(L)
    .beginClass<A>("A")
    .addConstructor<void(*) (const std::string&)>()
    .addFunction("getName", &A::getName)
    .addFunction("printName", &A::printName)
    .endClass();

现在,你可以将 Lua 字符串作为参数传递给 A 类的构造函数和其他函数,并且不会遇到断言错误。请确保在 Lua 脚本中使用字符串时使用引号括起来,如 'moo'


如果你确实需要传递指向字符数组的指针,并在 C++ 中直接操作内存区域,你可能需要使用 LuaBridge 的自定义类型转换功能来处理。这可能需要更复杂的代码,涉及将 Lua 字符串复制到 C++ 字符数组中,并在 C++ 中释放内存等操作。根据你的需求和使用情况,可能需要更详细的解决方案。