Здравствуйте, indee, Вы писали:
I>Нужно получит экземпляра объекта по его адресу:
Платформа какая?
Если 64-битная винда, то указатель — 64 бита, а long — 32 (не спрашивай почему они такие извращенцы, когда даже в дотнете long — 64).
Тебе нужен uintptr_t, а не long.
Но в общем случае такие пляски нужны только в особых случаях, типа передачи через WinAPI. А зачем в обычном коде приводить указатель к целому?
I>Правильно ли это, как это можно улучшить/обезопасить и правильно обвернуть MyObj* pObj = (MyObj*)p в try-catch?
Тут оборачивать не надо, если исходное значение было правильным указателем. А вот если нет причины ему доверять — то нельзя доверять и указателю без проверки.
А так уже сказали — указатель на объект базового класса решает >=90% подобных проблем.
indee:
I>Правильно ли это, как это можно улучшить/обезопасить и правильно обвернуть MyObj* pObj = (MyObj*)p в try-catch?
За преобразование целого в указатели без крайней нужды — выгоняют босиком на мороз.
Почему бы не возвращать сам указатель?:
MyObj *CreateObj()
Если уж невтерпёж кастовать между целым и указателем лучше использовать специальные совместимые по размеру типы вроде uintptr_t.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, indee, Вы писали:
I>>Нужно получит экземпляра объекта по его адресу:
N>Платформа какая? N>Если 64-битная винда, то указатель — 64 бита, а long — 32 (не спрашивай почему они такие извращенцы, когда даже в дотнете long — 64). N>Тебе нужен uintptr_t, а не long.
N>Но в общем случае такие пляски нужны только в особых случаях, типа передачи через WinAPI. А зачем в обычном коде приводить указатель к целому?
I>>Правильно ли это, как это можно улучшить/обезопасить и правильно обвернуть MyObj* pObj = (MyObj*)p в try-catch?
N>Тут оборачивать не надо, если исходное значение было правильным указателем. А вот если нет причины ему доверять — то нельзя доверять и указателю без проверки.
N>А так уже сказали — указатель на объект базового класса решает >=90% подобных проблем.
64-битная винда.
Адрес хранится в БД, поэтому указатель на объект базового класса использовать не могу.
Здравствуйте, indee, Вы писали:
I>64-битная винда. I>Адрес хранится в БД, поэтому указатель на объект базового класса использовать не могу.
Зачем так делать?
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, indee, Вы писали:
I>>64-битная винда. I>>Адрес хранится в БД, поэтому указатель на объект базового класса использовать не могу. _>Зачем так делать?
Из потустороннего мира используются ресурсы Win API.
Здравствуйте, indee, Вы писали:
N>>Платформа какая? N>>Если 64-битная винда, то указатель — 64 бита, а long — 32 (не спрашивай почему они такие извращенцы, когда даже в дотнете long — 64). N>>Тебе нужен uintptr_t, а не long.
I>64-битная винда.
Ну таки uintptr_t, а если его нет — unsigned long long.
I>Адрес хранится в БД, поэтому указатель на объект базового класса использовать не могу.
Адрес в БД на объекты рантайма процесса... по-моему, супербред.
А что будет в случае рестарта процесса?
Может, ввести таблицу хэндлов и писать в БД именно их?
* try-catch тут не поможет, если вдруг...
* Лучше возвращать не указатель в лонге, а скажем значение ключа из мапы. А по этому ключу из мапы потом доставать объект.
Ну, я если экономите на спичках указателях, то так:
MyObj* myObjs[256];
std::uint8_t last = 0;
long CreateObj(){
//assert(0xFF != last && "Open up the limit :)");
myObjs[last++] = new MyObj();
return last - 1;
}
...
void getObj(long p){
//assert(0 <= p && p <= 255);
MyObj* pObj = myObjs[p];
}
I>Правильно ли это,
нет.
I>как это можно улучшить/обезопасить
тысячи есть способов.
I> и правильно обвернуть MyObj* pObj = (MyObj*)p в try-catch?
нет. не правильно.
Здравствуйте, indee, Вы писали:
I>Здравствуйте, kov_serg, Вы писали:
_>>Здравствуйте, indee, Вы писали:
I>>>64-битная винда. I>>>Адрес хранится в БД, поэтому указатель на объект базового класса использовать не могу. _>>Зачем так делать?
I>Из потустороннего мира используются ресурсы Win API.
Тип HANDLE в WinAPI это void*. Почему бы не использовать его?
А хранить адрес в БД зачем? Почему приложение само не хранит адрес? Что будет, если процесс остановится нештатно? Как БД вычищаться будет?
I>>Из потустороннего мира используются ресурсы Win API.
AN>Тип HANDLE в WinAPI это void*.
Ох, блин далеко как не всегда... Очень даже не всегда! Хендлы бывают разных типов, это раз…
А еще в разных версиях Windows хендлы одного и того же типа могут быть с-а-а-всем разные по начинке. Это два-с…
В одном случае это может и правда указатель вида void*, в соседней винде это может быть и вовсе некий индекс, или ключ в определенной внутренней таблице Windows.