将const char *从std :: string传递到Lua堆栈变为null

时间:2012-01-02 17:25:18

标签: c++ lua stdstring

我有这段代码,我从我的游戏支持的不同类型的设备中收集设备ID,并设置lua global以具有当前设备的id值。 当我得到iOS设备的id时,我从一个混合的C ++ / Objective-C类接收一个const char *并将它传递给Lua堆栈。一切正常。 但是我从一段负责获取Android设备ID的代码中收到std :: string。当我推送deviceId.c_str()时,我在Lua中得到nil。 我已经尝试从负责获取设备ID的代码中传递const char *,但是当它从函数返回时,指针似乎出现了错误[这就是为什么我决定返回字符串,它以这种方式工作正常]。

如何允许从std :: string中传递const char *而不会出现问题?

编辑: 我尝试过使用strcpy,但它不起作用:/仍然有同样的问题。

所以..负责从不同设备收集deviceId的代码如下所示:

#include "DeviceInfo.h"
#include "DeviceInfoIOS.h"
#include "DeviceInfoAndroid.h"
#include <string>


USING_NS_CC;

extern "C" {

const char *getDeviceId() {

    const char *deviceId;

    CCLog("test");

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    DeviceInfoIOS ios;
    deviceId = ios.getIOSDeviceId();
    CCLog("iOS platform %s", deviceId);

#endif  // CC_PLATFORM_IOS

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    CCLog("Android platform");
    std::string tempId = getAndroidDeviceId();
    CCLog("Android platform test %s", tempId.c_str());
    char y[tempId.size() + 1];
    strcpy(y, tempId.c_str());
    deviceId = (const char*) y;
    CCLog("Android platform %s", deviceId);


#endif  // CC_PLATFORM_ANDROID
    CCLog("Finished platform check");
    return deviceId;
}

}

只是一个小小的注释:所有日志看起来都不错。 Devie id很好。

这是我将设备ID传递给Lua的方式:

//deviceInfo
CCLog("DeviceInfo load");
const char *deviceId = getDeviceId();
CCLog("DeviceInfo %s", deviceId);
lua_pushstring(d_state, deviceId);
lua_setglobal(d_state, "DEVICE_ID");

同样在这里,logfile包含设备ID。

1 个答案:

答案 0 :(得分:2)

您的getDeviceId功能已损坏。 tempIdy都是堆栈变量。返回后,它们将被销毁。返回指向堆栈变量的指针总是一个坏主意。

你的功能应该返回std::string。如果失败了,它应该返回一个分配 char*的{​​{1}}数组,并且该用户应该使用new解除分配。这通常是为什么最好只返回delete。或者,您可以使用固定大小(而不是基于字符串的大小)将std::string作为y局部变量进行delcare。