C++ 当作为参数传递给Freetype时,const char将被清空

C++ 当作为参数传递给Freetype时,const char将被清空,c++,c,freetype2,C++,C,Freetype2,我挠头想弄明白为什么这个论点没有正确通过。以下是相关代码,为简洁起见将其缩短: bool CCImage::initWithString( const char * pText, int nWidth/* = 0*/, int nHeight/* = 0*/, ETextAlign eAlignMask/* = kAlignCenter*/, const char * pFontName/* = nil*/, int nSize/* = 0*/)

我挠头想弄明白为什么这个论点没有正确通过。以下是相关代码,为简洁起见将其缩短:

bool CCImage::initWithString(
    const char * pText,
    int nWidth/* = 0*/,
    int nHeight/* = 0*/,
    ETextAlign eAlignMask/* = kAlignCenter*/,
    const char * pFontName/* = nil*/,
    int nSize/* = 0*/)
{
    do
    {
        BitmapDC &dc = sharedBitmapDC();

        const char* pFullFontName = CCFileUtils::fullPathFromRelativePath(pFontName);
        CCLog("font is %s\n", pFullFontName);

        dc.getBitmap(pText, nWidth, nHeight, eAlignMask, pFullFontName, nSize);
    }

bool getBitmap(const char *text, int nWidth, int nHeight, CCImage::ETextAlign eAlignMask, const char * pFontName, float fontSize) {
    FT_Face face;
    FT_Error iError;

    bool bRet = false;
    if (libError) {
        return false;
    }
    do {
        iError = FT_New_Face( library, pFontName, 0, &face );
        CCLog("error is %d font is %s\n", iError, pFontName);
        if (iError) {
            iError = FT_New_Face( library, "/usr/share/fonts/arial.ttf", 0, &face );
        }
    }
大约20%的情况下,字体显示正确。其余时间,在第一张FT_NEW_FACE失败后,它们显示为arial。CCLogs的输出(只是printf的一个宏)说明了原因。以下是尝试加载四个标签的字体的输出:

font是./Res/fonts/kaculation.ttf
错误为1,字体为
字体为./Res/fonts/kaculation.ttf
错误为0 font is./Res/fonts/kaculation.ttf
字体为./Res/fonts/kaculation.ttf
错误为1,字体为
字体为./Res/fonts/kaculation.ttf
错误为1,字体为

如您所见,对于除第二个以外的所有对象,pFontName在通过initWithString传递和通过getBitmap接收之间以某种方式被清空。但我不知道为什么。更令人困惑的是,它完全是随机的,什么时候起作用,什么时候不起作用。我是为WebOS编写的,这在其他平台上似乎没有发生(事实上,几天前它在WebOS上运行得很好),但我不认为这是一个平台问题,它似乎太基本了。我比计划晚了两周,压力很大,所以我可能错过了一些简单的事情。但我希望有一些想法能让我重新取得进步,而不是旋转轮子。

为简洁而缩短“是否对
getBitmap
开始时发生的事情有任何影响?似乎某些内容已被更改,因为您发布的代码有一个
do{…}
而没有
,而在末尾:-)。如果在调用
FT\u New\u Face
之前记录传递给
getBitmap
的参数,名称是否正确?(可能
FT\u New\u Face
,尽管声明中有
const
,但有时会在其路径名参数上涂鸦。可能不是试图通过
const char*
写入,这似乎是一个太明显的错误,但可能其他地方的某个指针或偏移量正在损坏。在
之后,您看到了什么>CCLog
调用
getBitmap
,转储(比如)的整数值
pFontName
的前16个字节通过将从
CCFileUtils::fullPathFromRelativePath
返回的
NSString*
转换为
const char*
,可以使
NSString
对象未使用,从而能够被释放。这使得
const char*
指针可能指向不再存在。有一段时间我忘了添加到缩短版中,但开头是一样的。嗯,如果我在FT_New_Face之前记录它,它确实会正确显示。它不是NSString,我使用的是CoCoCos2D-x,而不是CoCoCos2D。@DavidSchwartz:假设这段代码使用的是CoCoCos3Dx,
CCFileUtils::FullPathFromRelativePathh
直接返回
字符常量*
)。