powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поймать факт перезаписи
25 сообщений из 123, страница 1 из 5
Поймать факт перезаписи
    #38073764
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct catcher
{ 
    // то тут?
};
catcher* globalStore = 0;
int main()
{
    globalStore = new catcher;
    globalStore = new catcher; // как автоматом удалить первый
    
    return 0;
}



Можно ли как-нибудь в кетчере поймать факт перезаписи указателя и соотв. автоматом убить первый объект??
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074263
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется в общем случае эта проблема называется Memory Leak Detection
и можно искать по этим ключевым словам.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074285
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixМожно ли как-нибудь в кетчере поймать факт перезаписи указателя и соотв. автоматом убить первый объект??
Да. Использовать смарт указатели.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074287
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074294
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Правильно, надо использовать достаточно умные указатели, а не слишком умные :)
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074295
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну он не истинный самурай - переживет.
Но вот то, что он хочет именно в исходно запрошенном виде - это действительно не С++ ))
А умные поинтеры - почему бы и нет?
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074298
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну.. щас мы с вами разбежимся в разные стороны. А какие умные?
auto_ptr? shared_ptr? Каких библиотек? И вообще какие умнее?
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074323
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете попробовать перегрузить new для catcher..
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074328
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton ,
Либо я чего-то не понял, либо вопрос должен звучать не так:

А какие умные? И вообще какие умнее?

А так:

А какие решают поставленную задачу?


Выглядит как "Ща мы разбежимся, а чтобы мотивировать вас, я тут припас... дробовик!"
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дада. И дробовик у меня тоже есть. Давайте в контексте.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074350
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что давать то?
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074364
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дискутировать говорю в контексте вопроса.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074372
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В контексте вопроса "Какие указатели умнее?" или в контексте вопроса "Как автоматически удалить объект?"? Хватит флиртовать, не пятница же.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074399
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А шо тут дискутировать.
OoCc уже ответил - использовать смарт-указатели.
Если указатели только локальные, то - std::auto_ptr, std::unique_ptr, boost::scoped_ptr.
Если плнируется передавать за пределы функции - то std::shared_ptr, boost::shared_ptr.
Выбрать из списка то что поддерживает компилятор.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074514
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
auto_ptr вроде как deprecated теперь... вместо него (если нужно именно его поведение) предлагают std::unique_ptr
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074516
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну видно же, что автор топика хочет "прострелить себе ногу", фигурально выражаясь
поэтому, несомненно, настойчиво рекомендую перегрузить ему оператор new
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074549
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the bestну видно же, что автор топика хочет "прострелить себе ногу", фигурально выражаясь
поэтому, несомненно, настойчиво рекомендую перегрузить ему оператор new
Код давайте. Это будет уже интересный вброс для обсуждения и более чем в контексте ))
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074564
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.Dragonkosh the bestну видно же, что автор топика хочет "прострелить себе ногу", фигурально выражаясь
поэтому, несомненно, настойчиво рекомендую перегрузить ему оператор new
Код давайте. Это будет уже интересный вброс для обсуждения и более чем в контексте ))

из статического массива сделать фабрику указателей - банально.
Давайте сразу что нибудь с векторами унутрях )
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074581
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".

Ошибаешься, там не смартуказатели, там габаж колекторы.
Габаж коллекторы медленные. Смартуказатели быстрые.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074643
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonЕсть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".

Ошибаешься, там не смартуказатели, там габаж колекторы.
Габаж коллекторы медленные. Смартуказатели быстрые.

А принцип С++ "Определение - есть инициализация " (С) Страуструп ,
еще быстрее :)
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074646
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаР
А принцип С++ "Определение - есть инициализация " (С) Страуструп ,
еще быстрее :)

Поэтому я поддерживаю идею повелосипедить на предмет перегрузки для придания умности new.
И сравнить производительность.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074685
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другое дело.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074689
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kosh the bestможете попробовать перегрузить new для catcher..

Можете подсказать как именно построить решение с перегрузкой new / delete конкретно для этого случая?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
struct catcher
{ 
    public:
    void* operator new(size_t size) 
    { 
        // как тут получить доступ к перезаписываемому
        // указателю-то??

        return ::operator new(size, std::nothrow); 
    }
    void operator delete(void* obj) 
    { 
        ::operator delete(obj); 
        
        // через что тут обнулять-то??
        // ведь операция удаления в самом
        // общем виде не обязывает программу
        // юзать указатель вообще...
    }
    
};
catcher* globalStore = 0;
int main()
{
    globalStore = new catcher;
    globalStore = new catcher;
    
    return 0;
}
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074714
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonЕсть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".

Ошибаешься, там не смартуказатели, там габаж колекторы.
Габаж коллекторы медленные. Смартуказатели быстрые.
Он не быстрый и не медленный. Мы не можем вычленить и детерминировать
время работы смарт-указателя по сравнению с GC. Это в мультипоточности
происходит.

Кстати в тему продолжения 13587263 . Я ставил Oracle JRockit
чтобы посмотреть как ораклоиды хвастаются своим новым GC. Но пока
еще до тестов дело не дошло.
...
Рейтинг: 0 / 0
Поймать факт перезаписи
    #38074735
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixkosh the bestможете попробовать перегрузить new для catcher..

Можете подсказать как именно построить решение с перегрузкой new / delete конкретно для этого случая?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
struct catcher
{ 
    public:
    void* operator new(size_t size) 
    { 
        // как тут получить доступ к перезаписываемому
        // указателю-то??

        return ::operator new(size, std::nothrow); 
    }
    void operator delete(void* obj) 
    { 
        ::operator delete(obj); 
        
        // через что тут обнулять-то??
        // ведь операция удаления в самом
        // общем виде не обязывает программу
        // юзать указатель вообще...
    }
    
};
catcher* globalStore = 0;
int main()
{
    globalStore = new catcher;
    globalStore = new catcher;
    
    return 0;
}



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


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