Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Универсального способа определения мусорного указателя вообще не существует, имхо (update) 10.12.04 15:24 Число просмотров: 2320
Автор: amirul <Serge> Статус: The Elderman Отредактировано 10.12.04 15:34 Количество правок: 3
|
> В целом по использованию приведений типа см. цитату > amirul'а из Страуструпа. А надежного способа определения > мусорных указателей в C++, увы, нет и не предвидится. Вернее можно внедрить в язык то, что можно сделать средствами C++ уже сейчас. Речь о том, чтобы сделать ВСЕ классы своей иерархии наследниками одного базового, например CObject
Ну и после этого делать что то типа:
class CObject {
private:
static const unsigned long ExpectedSignature = 0x12345678; // Какое нить достаточно случайное число
unsigned long Signature;
public:
CObject(): Signature(ExpectedSignature) {}
virtual ~CObject() = 0;
bool IsObject() {
__try {
return (Signature == ExpectedSignature);
} __except (EXCEPTION_EXECUTE_HANDLER) {
return false;
}
}
};
---
ну и использовать как нибудь так:
void
f(void *ptr) {
CObject *object = reinterpret_cast<CObject *>(ptr);
if (object->IsObject()) {
deriv = dynamic_cast<CMyDerivedClass *>(object);
} else {
throw bad_cast();
}
}
---
Вероятность того, что под этим указателем будет память и при этом будет содержать нужную сигнатуру будет меньше, чем 2^(-32)
Хотя эта самая сигнатура является ничем иным как полем типа, которое в C++ не рекомендуется. Опять таки повторюсь, что не знаю ни одной ситуации, которая бы привела к ПОЛНОЙ потере информации о типе в C++. Скорее всего дизайн проекта сделан не совсем верно. Если скажут, какую задачу нужно решить с помощью динамического кастования, то возможно мы найдем другой способ
-----------------
В вышеприведенном коде вместо микрософтовского SEH вполне можно использовать стандартные try/catch блоки
|
|
|