Static_pointer_cast базовой структуры Shared_ptr в наследующую структуру Shared_ptr создает перегрузку буфера [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Static_pointer_cast базовой структуры Shared_ptr в наследующую структуру Shared_ptr создает перегрузку буфера [закрыто]

Сообщение Anonymous »

У меня есть базовая структура BaseToken

Код: Выделить всё

enum class TokenTypes
{
...
UNKNOWN,
...
};

struct BaseToken
{
TokenTypes Type = TokenTypes::UNKNOWN;
std::shared_ptr ParentScope = nullptr;
};

Этот BaseToken создается и присваивается другой структуре с именем ParseNode

Код: Выделить всё

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);
Структура ParseNode затем отправляется в функцию AddParseNode, которая выполняет push_back в статический std::vector
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;
}
Функция GetTokenType — это еще одна статическая функция из Tokenizer, которая возвращает TokenType. Если бы он не вернул TokenType, программа остановилась бы с моим сообщением об ошибке, чего не произошло.
Поскольку ParseNode больше не нужен, он удаляется.
После этого BaseToken назначается

Код: Выделить всё

static std::shared_ptr ThisToken;

Код: Выделить всё

ThisToken = ConvertParseNodeToBaseToken(parseNode);
в классе Tokenizer.
Примечание. Все эти статические члены инициализируются в 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;
};

Это внутри пространства имен Types

Код: Выделить всё

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);
Любая попытка записать или получить доступ к атрибутам, специфичным для структуры Variable_Definition, немедленно приводит к ошибке с помощью средства очистки адресов Visual Studio

Код: Выделить всё

Address Sanitizer Error: Heap buffer overflow
Я использовал пример

Код: Выделить всё

Token->VariableName = " A";
Если бы вы видели мой вопрос раньше, вы бы знали, что я упомянул вектор unique_ptrs из Modifiers::Modifier. Это больше не имеет никакого значения, за исключением того, что ошибка, возникающая при попытке доступа или редактирования вектора, создает ошибку

Код: Выделить всё

Address Sanitizer Error: Use of deallocated memory
Вероятно, это проблема с памятью. Я уже упоминал, что я удаляю память только тогда, когда удаляю ParseNode.
Добавив виртуальный деконструктор в BaseToken, я попробовал Dynamic_pointer_cast что привело к нулевому значению
Надеюсь, мое повторное редактирование этого вопроса окажется более полезным!
PS: Спасибо. @Pepijn Kramer за предложение добавить значения перечисления UNKNOWN для структур. Кажется, я добавил их для каждой структуры и добавил значения nullptr для атрибутов указателей, но это не остановило ошибки.

Подробнее здесь: https://stackoverflow.com/questions/791 ... d-ptr-stru
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»