Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поймать факт перезаписи / 25 сообщений из 123, страница 1 из 5
11.12.2012, 11:24
    #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
11.12.2012, 15:07
    #38074263
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
Кажется в общем случае эта проблема называется Memory Leak Detection
и можно искать по этим ключевым словам.
...
Рейтинг: 0 / 0
11.12.2012, 15:18
    #38074285
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
LumixМожно ли как-нибудь в кетчере поймать факт перезаписи указателя и соотв. автоматом убить первый объект??
Да. Использовать смарт указатели.
...
Рейтинг: 0 / 0
11.12.2012, 15:21
    #38074287
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
Есть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".
...
Рейтинг: 0 / 0
11.12.2012, 15:24
    #38074294
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
mayton,

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

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

А так:

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


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

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

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

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

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

Поэтому я поддерживаю идею повелосипедить на предмет перегрузки для придания умности new.
И сравнить производительность.
...
Рейтинг: 0 / 0
11.12.2012, 18:06
    #38074685
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
Другое дело.
...
Рейтинг: 0 / 0
11.12.2012, 18:09
    #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
11.12.2012, 18:20
    #38074714
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поймать факт перезаписи
MasterZivmaytonЕсть разные способы борьбы с проблемой. На мой взгляд для С++ надо просто не писать
такой код. Попытка создать сверх-умные указатели привела к созданию целого спектра
тяжёлых технологий которые сегодня юзаются в Java и .Net. Это не путь С++. Короче
Это не путь для истинного "самурая".

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

Кстати в тему продолжения 13587263 . Я ставил Oracle JRockit
чтобы посмотреть как ораклоиды хвастаются своим новым GC. Но пока
еще до тестов дело не дошло.
...
Рейтинг: 0 / 0
11.12.2012, 18:38
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поймать факт перезаписи / 25 сообщений из 123, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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