[C++, gcc4.7] Как перегрузить new, delete?

Ventalf

В проекте у меня
aloc.h
aloc.cpp
aloc.h cостоит из

//pair 1
void* operator new(std::size_t size) throw(std::bad_alloc);
void operator delete(void* ptr) throw;

//pair 2
void* operator new (std::size_t size, const std::nothrow_t&) throw;
void operator delete (void* ptr, const std::nothrow_t&) throw;

//pair 3
void* operator new [](std::size_t size) throw(std::bad_alloc);
void operator delete[](void* ptr) throw;

//pair 4
void* operator new [](std::size_t size, const std::nothrow_t&) throw;
void operator delete[](void* ptr, const std::nothrow_t&) throw;

alloc.cpp содержит реализацию операторов.
Делаю

#include "alloc.h"

в каждом исходнике в последнем месте среди "include" -ов
В результате компилация с g++ 4.7.0 проходит успешно, но почему то компоновщик берет ссылку на стандартный оператор вместо моих.
Вопрос в следующем, как заставить компилятор использовать мои операторы new/delete?

Serab

ты точно линкуешь aloc.o? У меня все работает без всяких ухищрений, даже h-файл создавать не надо.

Ventalf

извини, моя ошибка
компоновщик не включал alloc.o, теперь все работает
даже h-файл создавать не надо
это потому что компилятор сам автоматически включает аналогичный заголовок для каждого сорса?

Serab

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

Serab

Я тебя сразу на всякий случай предупрежу: если делаешь so'шку, то надо из нее стрипать потом эти символы, чтобы в другие проги твои операторы не подгружались. Просто это аццкие грабли.

Ventalf

Я понимаю что не при каких обстоятельствах нельзя переопределять эти операторы в глобальном скопе. Наверное единственное оправдание для этого будет в том случае если пишешь вирус который должен поместиться в очень маленький бинарник.
То что я делаю это эксперимент. В операторах delete помещают пустоту, чтоб он ничего не делал, для того чтоб доказать что причину memory corruption в кое каком ужасном C/C++ коде таиться не в неправильном использовании new/delete, что я уже сделал.
В данном случай valgrind не работает, потому что использую Python из которого загружаю библиотеку .so C++

Ventalf

Кстати, почему компилятор не допускает чтоб я переопределил эти операторы в сustom namespace?

Serab

не знаю, наверное, потому что в этом нет смысла. Или ты хочешь, чтобы им создавались все типы, которые там описаны? Такого маханизма в плюсах нет, если хочешь такую функциональность, надо переопределять в каком-нибудь классе и от него наследоваться.

spitfire

А может быть malloc_hook(3)?
Оставить комментарий
Имя или ник:
Комментарий: