В следующей короткой программе: при запуске без valgrind вызывается перегруженный глобальный новый оператор, с valgrind он вообще не вызывается, вместо этого он, очевидно, вызывает глобальный новый оператор valgrind. Мой вопрос: как мы можем заставить valgrind вызывать глобальное создание/удаление приложения? (valgrind 3.13.0; OS Linux, Ubuntu 14.04.5 LTS, x86_64) (Перегруженный оператор приложения может пометить память как используемую с помощью макросов VALGRIND_MEMPOOL_ALLOC/VALGRIND_MEMPOOL_FREE, но мы этого не делаем)
(Редактировать: в valgrind 3.10.1 вызывается глобальный новый оператор)
#include
#include
void* operator new (size_t size_i) throw (std::bad_alloc)
{
fprintf(stderr,"new %d (operator new (size_t size_i) throw (std::bad_alloc))\n", __LINE__);
return malloc(size_i);
}
void* operator new (size_t size_i, const std::nothrow_t& nothrow_value) throw()
{
fprintf(stderr,"new %d (operator new (size_t size_i, const std::nothrow_t& nothrow_value) throw())\n", __LINE__);
return malloc(size_i);
}
void* operator new[] (size_t size_i) throw (std::bad_alloc)
{
fprintf(stderr,"new %d (operator new[] (size_t size_i) throw (std::bad_alloc)) \n", __LINE__);
return malloc(size_i);
}
void* operator new[] (size_t size_i, const std::nothrow_t& nothrow_value) throw()
{
fprintf(stderr,"new %d (operator new[] (size_t size_i, const std::nothrow_t& nothrow_value) throw()) \n", __LINE__);
return malloc(size_i);
}
void operator delete (void* p_i) throw()
{
fprintf(stderr, "delete %d (operator delete (void* p_i) throw())\n",__LINE__);
free(p_i);
}
void operator delete (void* p_i, const std::nothrow_t& nothrow_constant) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
void operator delete[] (void* p_i) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
void operator delete[] (void* p_i, const std::nothrow_t& nothrow_constant) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
#include
main()
{
fprintf(stderr, "ku !\n");
char * a = new char[123];
delete [] a;
int * b = new int();
delete b;
return 0;
}
Теперь скомпилируйте
gcc -g valg.cpp -lstdc++
запустите без valgrind
$ ./a.out
ku !
new 19 (operator new[] (size_t size_i) throw (std::bad_alloc))
delete 43
new 6 (operator new (size_t size_i) throw (std::bad_alloc))
delete 31 (operator delete (void* p_i) throw())
При использовании глобального оператора valgrind new не вызывается.
valgrind ./a.out
==24181== Memcheck, a memory error detector
==24181== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==24181== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==24181== Command: ./a.out
==24181==
ku !
==24181==
==24181== HEAP SUMMARY:
==24181== in use at exit: 0 bytes in 0 blocks
==24181== total heap usage: 2 allocs, 2 frees, 127 bytes allocated
==24181==
==24181== All heap blocks were freed -- no leaks are possible
==24181==
==24181== For counts of detected and suppressed errors, rerun with: -v
==24181== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Подробнее здесь: https://stackoverflow.com/questions/471 ... pplication
Valgrind не вызывает перегруженный глобальный оператор нового приложения ⇐ C++
Программы на C++. Форум разработчиков
1765537767
Anonymous
В следующей короткой программе: при запуске без valgrind вызывается перегруженный глобальный новый оператор, с valgrind он вообще не вызывается, вместо этого он, очевидно, вызывает глобальный новый оператор valgrind. Мой вопрос: как мы можем заставить valgrind вызывать глобальное создание/удаление приложения? (valgrind 3.13.0; OS Linux, Ubuntu 14.04.5 LTS, x86_64) (Перегруженный оператор приложения может пометить память как используемую с помощью макросов VALGRIND_MEMPOOL_ALLOC/VALGRIND_MEMPOOL_FREE, но мы этого не делаем)
(Редактировать: в valgrind 3.10.1 вызывается глобальный новый оператор)
#include
#include
void* operator new (size_t size_i) throw (std::bad_alloc)
{
fprintf(stderr,"new %d (operator new (size_t size_i) throw (std::bad_alloc))\n", __LINE__);
return malloc(size_i);
}
void* operator new (size_t size_i, const std::nothrow_t& nothrow_value) throw()
{
fprintf(stderr,"new %d (operator new (size_t size_i, const std::nothrow_t& nothrow_value) throw())\n", __LINE__);
return malloc(size_i);
}
void* operator new[] (size_t size_i) throw (std::bad_alloc)
{
fprintf(stderr,"new %d (operator new[] (size_t size_i) throw (std::bad_alloc)) \n", __LINE__);
return malloc(size_i);
}
void* operator new[] (size_t size_i, const std::nothrow_t& nothrow_value) throw()
{
fprintf(stderr,"new %d (operator new[] (size_t size_i, const std::nothrow_t& nothrow_value) throw()) \n", __LINE__);
return malloc(size_i);
}
void operator delete (void* p_i) throw()
{
fprintf(stderr, "delete %d (operator delete (void* p_i) throw())\n",__LINE__);
free(p_i);
}
void operator delete (void* p_i, const std::nothrow_t& nothrow_constant) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
void operator delete[] (void* p_i) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
void operator delete[] (void* p_i, const std::nothrow_t& nothrow_constant) throw()
{
fprintf(stderr, "delete %d\n",__LINE__);
free(p_i);
}
#include
main()
{
fprintf(stderr, "ku !\n");
char * a = new char[123];
delete [] a;
int * b = new int();
delete b;
return 0;
}
Теперь скомпилируйте
gcc -g valg.cpp -lstdc++
запустите без valgrind
$ ./a.out
ku !
new 19 (operator new[] (size_t size_i) throw (std::bad_alloc))
delete 43
new 6 (operator new (size_t size_i) throw (std::bad_alloc))
delete 31 (operator delete (void* p_i) throw())
При использовании глобального оператора valgrind new не вызывается.
valgrind ./a.out
==24181== Memcheck, a memory error detector
==24181== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==24181== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==24181== Command: ./a.out
==24181==
ku !
==24181==
==24181== HEAP SUMMARY:
==24181== in use at exit: 0 bytes in 0 blocks
==24181== total heap usage: 2 allocs, 2 frees, 127 bytes allocated
==24181==
==24181== All heap blocks were freed -- no leaks are possible
==24181==
==24181== For counts of detected and suppressed errors, rerun with: -v
==24181== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Подробнее здесь: [url]https://stackoverflow.com/questions/47174671/valgrind-not-calling-overloaded-global-operator-new-of-application[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия