LINUX.ORG.RU

>переопределением new и delete

А не боишься без пальцев остаться?

anonymous
()

ты хочешь проверить, не выдаст ли тебе сегфолт попытка чтения по указанному адресу? В лялексе такого нет вроде. Разве что собственно сегфолт обрабатывать.

anonymous
()

просто переопределение new и delete ничего не даст, каст указателя к родительскому классу даст тебе другой адрес

wota ★★
()
Ответ на: комментарий от anonymous

ты хочешь проверить, не выдаст ли тебе сегфолт попытка чтения по указанному адресу?

сегфолта может и не быть, как и валидного объекта по данному адресу

wota ★★
()
Ответ на: комментарий от anonymous

У меня есть класс в котором куча говна, говно туда создает юзер, юзер же должен и delete ему вызывать, но что если юзер этого не сделал, вот я и хочу минимально без костылей сам повызывать делеты говну при удалении кучи говна. При делете нельзя самому удаляться из кучи говна, потомучто одно говно может быть в нескольких кучах. как то так...

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

«юзер же должен и delete ему вызывать, но что если юзер этого не сделал,» - тогда он дебил и идет лесом со своими проблемами

wota ★★
()
Ответ на: комментарий от pozitiffcat

тогда умные указатели, и не надо решать подобные задачи по другому - только испортишь код и добавишь потенциальные баги

wota ★★
()
Ответ на: комментарий от pozitiffcat

У меня есть класс в котором куча говна, говно туда создает юзер, юзер же должен и delete ему вызывать, но что если юзер этого не сделал, вот я и хочу минимально без костылей сам повызывать делеты говну при удалении кучи говна.

Поздравляю, ты дошёл до идеи сборки мусора.

Miguel ★★★★★
()
Ответ на: комментарий от pozitiffcat

При делете нельзя самому удаляться

В простейшем случае достаточно в комментарии указывать владение и передачу владения. Например про метод QAbstractItemModel::setItem() в документации Qt говорится: QAbstractItemModel получает владение переданным ему указателем. А само хранение - в умных указателях, заодно код безопасный к исключениям будет.

Для разделяемых ресурсов есть std::shared_ptr, или в крайнем случае подсчёт ссылок

/* Взято из LLVM, идёт в сочетании с IntrusiveRefCntPtr,
    assert используется потому что LLVM предназначен для
    вызова компилятора в отдельном потоке с восстановлением после сбоя */
  template <class Derived>
  class RefCountedBase {
    mutable unsigned ref_cnt;

  public:
    RefCountedBase() : ref_cnt(0) {}
    RefCountedBase(const RefCountedBase &) : ref_cnt(0) {}

    void Retain() const { ++ref_cnt; }
    void Release() const {
      assert (ref_cnt > 0 && "Reference count is already zero.");
      if (--ref_cnt == 0) delete static_cast<const Derived*>(this);
    }
  };

Иногда сама операция перераспределения памяти при вызове new оказывается дорогой, на этот случай есть пулы памяти, вот пример. В данном случае приходится передавать указатель на пул оператору new, зато вся память очистится тогда и только тогда, когда будет удалён экземпляр класса MemoryPool

new (pointerToPool) MyClass;

quiet_readonly ★★★★
()
Ответ на: комментарий от pozitiffcat

костыли, такие костыли.

заюзай shared_ptr и не парь мозг.

nanoolinux ★★★★
()
Ответ на: комментарий от pozitiffcat

напиши юзеру багрепорт.

а вообще, если уж совсем надо отслеживать delete на стороне, и есть доступ к коду юзера, сделай класс Trackable, который будет уведомлять контейнер о удалении, и Owner которого собсна и будут уведомлять через виртуальный метод void remove(Trackable *).

Потом все, что добавляется унаследуй до кучи от Trackable; а все куда добавляешь - от Owner. Trackable::~Trackable() пусть вызывает remove от соотв. Ownerа. При добавлении отмечай кого куда добавил. или хотя бы кого добавил, а потом по удалении перебором.

Для многопоточных аппликух надо конечно как-то это синхронизировать

ckotinko ☆☆☆
()

умные указатели уже есть в стандарте

Reset ★★★★★
()
Ответ на: комментарий от buddhist

настоящие програмисты на нём просто умеют читать.

nanoolinux ★★★★
()
Ответ на: комментарий от anonymous

ты хочешь проверить, не выдаст ли тебе сегфолт попытка чтения по указанному адресу? В лялексе такого нет вроде

В лялексе, может быть, и нет, а в Linux есть — pipe() + write() с проверкой errno на EFAULT.

sjinks ★★★
()
Ответ на: комментарий от sjinks

интересный спасибо, не знал про такой.

только есть один момент

int dd;
int *fd = &dd;
if (pipe(fd) == -1) {
	perror("error");
}
такой код работает, хотя &(dd+1) не является валидным. в смысле сегфолта не будет, если по нему обратиться, но он всё равно не занят ничем.

да, я что-то не понял зачем write. можешь объяснить? спасибо.

nanoolinux ★★★★
()
Ответ на: комментарий от slackwarrior

да ну нафиг. он бы щас начал о том, что всё надо переписать на С. с реализацией своих строк на асме, подогнаных под размер кеша.

nanoolinux ★★★★
()
Ответ на: комментарий от AptGet

есть же madvise.

А для madvise разве не является требованием использование mmap() над файлом? По-моему не с отображенной с файла памятью эта функция не работает.

sjinks ★★★
()
Ответ на: комментарий от nanoolinux

Нет, там другая идея.

void* buf;

int pipefd[2];
pipe(pipefd);

if (write(pipefd[1], buf, размер) == -1 && errno == EFAULT) {
    /* к памяти обратиться нельзя */
}
sjinks ★★★
()
Последнее исправление: sjinks (всего исправлений: 1)
Ответ на: комментарий от pozitiffcat

Всё просто.

Для такие идиотов, которые не осиливают удалить(хотя её не надо с нормальной архитектурой удалять) память - днища, и для них придумали специальные песочницы для детей с GC, ибо если эти «товарищи» немогут память убрать, то и какахи за собой 100% тоже не смогут, поэтому песочек+лоточек.

Вообще нипонятно, почему в реальном мире людей учат убирать какахи за собой, следить куда седалищем садишся(авось там нет стула), проверять, кипяток ты пьёшь( на руки себе льёшь) или тёплую воду, попадёшь ли ты себя по пальцу, когда что-то юзаешь? Почему эти люди не орут, - «это всё фуфло, дядя, создайте нам робота, который нам будет воду чекать и какахи убирать за нами, ибо мы немощи», а тем людям, которые им говорят - «вы тупые днища, которые за собой даже какахи убрать не можете - идите в детсад, ибо вы постоянно сидите и ждёте по 30-40 минут, пока робот какахаубирать не прилетит к вам и не уберёт за вами какахи», «К вам пришли в гости люди? Люди? Я жду пока какахинатор3000 не уберёт мои какахи, а отойти от него ян е могу. Подождите там полчаса, уже почти всё» и т.п. Отвечают, - «Вы днища, когда вы за собой убираете какахи - вы можете измазаться, забыть убрать какахи и потом на них наступить, или забыть обтереть седалище, а то потом будет пахнуть и „протекать“ - это не безопасно, вы нубота и днища, вы отбросы мира. А то, что я сижду и жду, пока мой какахинатор3000 уберёт какахи за мной по полчаса, зато безопасно и молодёжно.».

Из твоего уопротого описания - я ничего не опнял. Пили отдельный аллокатор для класса и сноси всю память при удалении кучи говна. Это будет и быстрее и тебе не надо заботиться от чеке ределита, ибо делит вообще не нужен.

Про проверку, если указатель копируется, то последние биты, если нет и тебе это нужно - твой код говно.

o2n3e
()
Ответ на: комментарий от wota

Я тебя о5 не увидел.

А ты хитрец, думаешь твой тухловектор быстрее и удобней buf[100500 * 100500]?

o2n3e
()

Как можно сделать сабж, не используя «умные указатели»

тебя в детстве умный указатель укусил?

drBatty ★★
()
Ответ на: комментарий от imtw

Что не может?

Запилить быстрее, удобней? Синтаксис шаблонов видал? Ну ладно синтаксис - к нему привыкаешь, но это всё ровно facepalm.

А вот про быстрее не надо, что буст, что STL тормазное фуфло. Сделать из него нечто не тормазящие - это надо перелопатить половину STL. Зачем мне лопатить половину стл"а, заморачиваться с кастылями для аллокаторов и прочей байды, о которой я писал в другой теме? Я заюзаю buf[100500 * 100500] - всё. Гцц умеет их создавать в куче с поведением как на стеке.

o2n3e
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.