powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка: при приведении типа указателя теряется указатель!
21 сообщений из 21, страница 1 из 1
Ошибка: при приведении типа указателя теряется указатель!
    #39647505
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В шаблонном классе написал простую функцию, которую вызываю для объекта специфицированного типом unsigned int32_t

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <cstdint>
#include "MyLib/Memory.h"

template <class type>
class allocator final
{
public:
type* AllocationMemory(std::size_t NeedSize) const
{
void* p = nullptr;
type* Memory = nullptr;

 p = MyLib::AllocationMemory(NeedSize); //p всегда имеет тип void* и после выполнения этой строки значение 0x7fffd80389b0
 Memory = (type*) p; // Memory до выполнения этой строки имеет тип unsigned int*, а сразу после выполнения- unsigned int и значение 0!!!

return Memory;
}
};



В файле Memory.cpp:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void* MyLib::AllocationMemory(csize_t Size)
{
    void* Memory = malloc(Size);
    if(!Memory) throw std::bad_alloc();

    return Memory;
}



Почему указатель превращается в обычный int???
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647515
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL// Memory до выполнения этой строки имеет тип unsigned int*, а сразу после выполнения- unsigned int и значение 0!!!

Почему указатель превращается в обычный int???
Это баг в твоём QtCreator в дебаге
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647595
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZAlekseySQL// Memory до выполнения этой строки имеет тип unsigned int*, а сразу после выполнения- unsigned int и значение 0!!!

Почему указатель превращается в обычный int???
Это баг в твоём QtCreator в дебаге

У меня эта проблема получается как в отладке, так и в релизе, причем для GCC и Intel- компиляторов с ключом -O0
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647603
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Я имел в виду, что у QtCreator'а есть такой баг, когда ты в нём дебажишь, внезапно у переменной может поменяться тип.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647608
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Где то врешь, все работает.

http://cpp.sh/5a6vw
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647610
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZAlekseySQL,

Я имел в виду, что у QtCreator'а есть такой баг, когда ты в нём дебажишь, внезапно у переменной может поменяться тип.

Так я отписался, что это не только в дебаге. У меня программа из- за этого вываливается.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647637
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие-то ужастики на ночь. Всю жизнь в C указателей можно было спокойно друг другу присваивать.

Что там может портится? просто копирование 32 (64) бит из одной переменной в другую. Но вполне возможно, что переменная портится где-то в другом месте.

Если есть простой тест кейс, на котором ошибка воспроизводится, то можно было бы разговаривать.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647729
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, а зачем так много бессмысленных переменных и присваиваний в функции allocator::AllocationMemory?
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647740
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychAlekseySQL, а зачем так много бессмысленных переменных и присваиваний в функции allocator::AllocationMemory?

Чтобы понять в какой операции происходит ошибка. Я, кстати, пробовал static_cast- таже ошибка.

Запустился под сатанинской Win10: Qt Creator c MinGW32 показывает такой же фокус. Так что хочу попробовать в Visual Studio с компиляторами Intel и MSVC, но боюсь, что темная сторона силы окончательно поглотит меня.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647786
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLбоюсь, что темная сторона силы окончательно поглотит меня.тяжело искать чёрную кошку в тёмной комнате, особенно когда её там нет)) но мы всё равно будем)) ошибка у тебя не здесь, очевидно
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39647907
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЧтобы понять в какой операции происходит ошибка. Я, кстати, пробовал static_cast- та же ошибка.А смысл? Приведение типа в си-стиле, это, по сути и есть static_cast. Для приведения от void* к другому типу указателя, пробуй reinterpret_cast.
Код: plaintext
1.
Memory = reinterpret_cast<type*>(p);
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648105
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLNekZAlekseySQL,

Я имел в виду, что у QtCreator'а есть такой баг, когда ты в нём дебажишь, внезапно у переменной может поменяться тип.

Так я отписался, что это не только в дебаге. У меня программа из- за этого вываливается.

Твоя программа вываливается НЕ ИЗЗА этого.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648107
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВ шаблонном классе написал простую функцию, которую вызываю для объекта специфицированного типом unsigned int32_t

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <cstdint>
#include "MyLib/Memory.h"

template <class type>
class allocator final
{
public:
type* AllocationMemory(std::size_t NeedSize) const
{
void* p = nullptr;
type* Memory = nullptr;

 p = MyLib::AllocationMemory(NeedSize); //p всегда имеет тип void* и после выполнения этой строки значение 0x7fffd80389b0
 Memory = (type*) p; // Memory до выполнения этой строки имеет тип unsigned int*, а сразу после выполнения- unsigned int и значение 0!!!

return Memory;
}
};



В файле Memory.cpp:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void* MyLib::AllocationMemory(csize_t Size)
{
    void* Memory = malloc(Size);
    if(!Memory) throw std::bad_alloc();

    return Memory;
}



Почему указатель превращается в обычный int???

Сама идея тоже какая-то дурацкая.
Мы выделяем память под тип type?
Но внезапно другого размера, чем sizeof(type) !
О как, назло всем врагам!
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648332
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivСама идея тоже какая-то дурацкая.
Мы выделяем память под тип type?
Но внезапно другого размера, чем sizeof(type) !
О как, назло всем врагам!

Это я уже упростил до предела, чтобы найти ошибку. На самом деле выделяется под массив элементов типа type, так что в реальной задаче есть перемножение размера на количество элементов.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648382
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivТвоя программа вываливается НЕ ИЗЗА этого.

Из- за неправильного приведения На второй итерации выделяется 0 байт памяти и программа вываливается при обращении к этому участку. Так что из- за этого.

Другой вопрос, что ошибка скорее всего сидит в другом месте, в уже выполненном коде, который так необычно себя проявляет. Я пробовал искать Intel Inspector- ом, но пока безрезультатно.

Какие есть инструменты поиска ошибок?
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648384
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLКакие есть инструменты поиска ошибок?
В лог писать или в консоль. После каждой строчки вставляешь вывод нужных переменных, потом изучаешь.

ИМХО по симптомам похоже что у тебя какой-то код память портит.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648386
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+ Причем самое прикольное, когда я закомментировал строки с выделением памяти (и чтением из файла в эту память), то программа отлично работает (правда с нулевыми данными) без ошибки. Intel Inspector продолжает писать о внутренней ошибке и с этой ошибкой просит обратиться к разработчикам продукта (т.е. к Intel).
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648388
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL+ Причем самое прикольное, когда я закомментировал строки с выделением памяти (и чтением из файла в эту память), то программа отлично работает (правда с нулевыми данными) без ошибки.
Попробуй закамментить обработку, т.е. оставить только выделение памяти.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648391
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сам найти не можешь в чем проблема: попробуй сделать небольшой проект, повторяющий твою ошибку и сюда выложи.
Нужен именно проект, а не куски кода, чтобы запустить можно было.

PS Обычно в процессе написания демонстрации проблемы приходит понимание ее причины.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648409
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, ошибка найдена!

Чтобы сместиться по куску памяти я складывал с указателем Data (типа type) не количество элементов а размер:
Код: plaintext
1.
2.
std::size_t SizeOfData = Quantity * sizeof(Type);
CurrentAllocator->ReadAllocatorFromMemory((void*) (Data + SizeOfData));



Поэтому программа выходила за пределы памяти.

А отладчик при хорошей работе программы так и продолжил показывать вместо указателя какие- то непонятные значения int (что меня сбило с толку). Насколько я понимаю это проблема дебугера GDB, но intel parallel studio, к сожалению, содержит также только GDB (похоже у них нет собственного отладчика). Так что заменить чем- то другим не получилось.
...
Рейтинг: 0 / 0
Ошибка: при приведении типа указателя теряется указатель!
    #39648666
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZivТвоя программа вываливается НЕ ИЗЗА этого.

Из- за неправильного приведения На второй итерации выделяется 0 байт памяти и программа вываливается при обращении к этому участку. Так что из- за этого.

Другой вопрос, что ошибка скорее всего сидит в другом месте, в уже выполненном коде, который так необычно себя проявляет. Я пробовал искать Intel Inspector- ом, но пока безрезультатно.

Какие есть инструменты поиска ошибок?

Отладчик, отладочная печать, логи, голова.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка: при приведении типа указателя теряется указатель!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]