首页 > 结构 std::queue 丢失 const char* 数据

结构 std::queue 丢失 const char* 数据

是这样的,我在做一个词法器,它扫描整个文本并且将分析好的 Token 写入一个队列里面。对于数字 Token 就存储数字,对于字符和字符串(不包括关键字)就要存储字符串,当然 Token 的类型是肯定会存储的。
结构是这样的

struct token_node
{
  TokenKind type;
  const char* string;
  double number;
}

在处理时因为是一个字符一个字符的处理,所以在处理阶段用的是 string 来接收的字符,读取结束后再判断是否是关键字,如果是关键字就直接存储 type 不存储其他信息。

void lexer::GetString(const char * stream, size_t & index)
{
    token_node newNode;
    std::string tmpString;
    
    newNode.string = "";

    while ((stream[index] >= 'a' && stream[index] <= 'z') || (stream[index] >= 'A' && stream[index] <= 'Z') 
         || stream[index] == '_' || (stream[index] >= '0' && stream[index] <= '9'))
    {
        char currentChar = userInputed[index];
        tmpString += currentChar;
        index++;
    }

    if (tmpString == "true")
    {
        newNode.type = TokenKind::KW_TRUE;
    }
        // 中间省略
    else if (tmpString == "return")
    {
        newNode.type = TokenKind::KW_RETURN;
    }
    else
    {
        newNode.type = TokenKind::OBJ_UNDEFINED;
        newNode.string = tmpString.data();
    }
#if 0
    if (newNode.type == TokenKind::OBJ_UNDEFINED)
    {
        std::cout << newNode.string << std::endl;
    }
#endif 

    this->_queue.push(newNode);

#if 0
        if (newNode.type == TokenKind::OBJ_UNDEFINED)
        {
                std::cout << this->_queue.front().string << std::endl
        }
#endif
    return;
}

那两个 #if 测试出来发现无论是 push 之前还是 push 之后得到的数据都是正常的,可是在这个函数执行完成之后返回时,数据就丢失了,变成了 "0"。对于数字也是同样方式处理的(写入 string 里面然后转换成数字存储),并没有丢失。


这里是std::string,函数调用完成后,tmpString析构,分配的data数据会被delete。
既然要使用string,token_node也用std::string吧,或者最好直接用堆分配的char数组。

【热门文章】
【热门文章】