Код: Выделить всё
enum class TokenTypes
{
...
UNKNOWN,
...
};
struct BaseToken
{
TokenTypes Type = TokenTypes::UNKNOWN;
std::shared_ptr ParentScope = nullptr;
};
Код: Выделить всё
struct ParseNode
{
std::string Value;
std::shared_ptr FutureToken = nullptr;
bool IsStatement = false;
};
Код: Выделить всё
ParseNode* parsenode = new ParseNode();
parsenode->FutureToken = std::make_shared();
...
Tokenizer::AddParseNode(parsenode);
ParseNodes; внутри статического класса Tokenizer
Метод внутри Tokenizer, называемый ConvertParseNodeToBaseToken, принимает структуру ParseNode и возвращаетshared_ptr
Код: Выделить всё
std::shared_ptr Tokenizer::ConvertParseNodeToBaseToken(ParseNode* parseNode)
{
std::shared_ptr BaseToken = parseNode->FutureToken;
BaseToken->Type = GetTokenType(parseNode->Value,parseNode->IsStatement);
delete parseNode;
parseNode = NULL;
return BaseToken;
}
Поскольку ParseNode больше не нужен, он удаляется.
После этого BaseToken назначается
Код: Выделить всё
static std::shared_ptr ThisToken;
Код: Выделить всё
ThisToken = ConvertParseNodeToBaseToken(parseNode);
Примечание. Все эти статические члены инициализируются в Tokenizer.cpp
После этого в отдельной функции класса Tokenizer ThisToken передается static_pointer_cast в производную структуру с именем Variable_Definition
Это внутри пространства имен Expressions
Код: Выделить всё
enum class Type
{
UNKNOWN,
};
struct BaseExpression
{
Type Type = Type::UNKNOWN;
};
using ExpressionsList = std::vector;
struct ContainsExpressions
{
ExpressionsList ExpressionsValue;
};
Код: Выделить всё
enum class Types
{
PURE,
...
UNKNOWN,
};
struct Modifier
{
Types Type = Types::UNKNOWN;
};
Код: Выделить всё
enum class Native
{
INT,
BOOl,
FLOAT,
DECIMAL,
STRING,
CHAR,
UNKNOWN,
};
Код: Выделить всё
struct Variable : public BaseToken, public Expressions::ContainsExpressions
{
std::vector Modifiers;
};
struct Variable_Definition : public Variable
{
std::string VariableName;
Types::Native VariableType = UNKNOWN;
};
Код: Выделить всё
std::shared_ptr Token = std::static_pointer_cast(ThisToken);
Код: Выделить всё
Address Sanitizer Error: Heap buffer overflow
Код: Выделить всё
Token->VariableName = " A";
Код: Выделить всё
Address Sanitizer Error: Use of deallocated memory
Надеюсь, мое повторное редактирование этого вопроса будет более полезным!PS: Спасибо @Pepijn Kramer за предложение добавить значения перечисления UNKNOWN для структур. Кажется, я добавил их для каждой структуры и добавил значения nullptr для атрибутов указателей, но это не остановило ошибки.
Подробнее здесь: https://stackoverflow.com/questions/791 ... d-ptr-stru
Мобильная версия