Valgrind не вызывает перегруженный глобальный оператор нового приложенияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Valgrind не вызывает перегруженный глобальный оператор нового приложения

Сообщение 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)


Подробнее здесь: https://stackoverflow.com/questions/471 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»