Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Вариант неплох, но ?! 23.07.01 20:17 Число просмотров: 950
Автор: c0x@mail.ru Статус: Незарегистрированный пользователь
|
> А ты попробуй дернуть слегка либо камень либо димку "на > ходу" :) > Очень знаешь ли поучительно ... разумеется все умрет но в > ряде > случаев ядро ловит этот трап а уж битую память это как 2 > байта да кто тут говорит о дергании - достаточно повышенной солнечной радиации в этом месяце и жаркой погоды, чтобы изменить пару бит по случайному адресу (опять же пресловутые законы Мерфи). Думаешь зря чтоли существуют соответствующие технологии (RAM ECC, SFT level XXX, etc...)
> Покажешь работающий код - прибивающий сей механизм бум > говорить > нет - не будет разговор будет тебе код.
> > > а так это пустая брехня, извини, ничего > личного... :) > > 8))) > > ну я не мембер, и не получаю от dl бабки как ты за > > "разводку" ламеров на этой борде, и рабочий код > постить - > > нет, пусть сами думают. > > Все так сурьезно ? :) > > за базар про бабки это ты перед dl объяснятся бушь, лады ? ну пусть и виртуальные (в виде рейтинга) но имеешь ведь !?? Или пиво !??
> > ... > > > > IsBadCodePtr > > > > IsBadReadPtr > > > > IsBadWritePtr > > достаточно и этого - умный схватит идею в комплексе. > > > > Ага - и как ты отличишь указатель на Calss1 от Class2 :))) а это забота компилятора, а не моя. А тем кто играется в игры class->void->class надо руки отшибать, ИМХО!
> > ЗЫЖ: а страница на объект тебя не ломет ? какая страница, памяти чтоли?
> Я пока не видел твоего :) >
// file "ptrtest.h"
template <class T>
class safeptr
{
T* realptr;
public:
safeptr(): realptr(NULL) {};
safeptr(T* ptr): realptr(ptr) {};
operator T*() { if( IsBadReadPtr(this, sizeof(*this))|IsBadReadPtr(realptr, sizeof(T))|IsBadWritePtr(realptr, sizeof(T)) ) throw (this);
return realptr;
};
T* operator ->() { if( IsBadReadPtr(this, sizeof(*this))|IsBadReadPtr(realptr, sizeof(T))|IsBadWritePtr(realptr, sizeof(T)) ) throw (this);
return realptr;
};
// ну и т.д. IsBadWritePtr(realptr, sizeof(T)) - опционально, есесьно если это указатель на const - то не надо.
};
// end file "ptrtest.h"
// file "ptrtest.cpp"
#include <windows.h>
#include "ptrtest.h"
typedef struct {
int a;
char b;
} somestruct;
void main(void)
{
safeptr<somestruct> p = new somestruct;
try {
p->a = 0x0a;
p->b = 'B';
}
catch (...) {
MessageBox(0, "memory access error", "XCEPTION", MB_ICONSTOP|MB_OK);
}
}
// end file "ptrtest.cpp"
вот и попробуй под отладчиком поменять значение realptr
а насчет более мелких ошибок - типа выхода за границу массива - повторюсь: имеются очень элегантные методы, например все теже умные массивы с перегруженными операторами доступа к элементу, итераторами и генераторами умных указателей для клиентского кода.
А тем, кого тянет на арифметику с указателями через заднюю калитку, надо просто руки отшибать. Или защищаться от них перегрузкой соответствующих операторов которые либо будут ничего не делать либо говорить что типа ты дурак и руки проч и в таком духе.
Короче, реальных указателей и массивов в программе не должно бытьВООБЩЕ- это и есть штиль программирования без глюков, ИМХО! Ну, кроме быть может частей кода тесно работающего с системными вызовами. Но там - это уже забота ядра.
|
|
|