Перегрузка оператора удаления в с ++ - PullRequest
3 голосов
/ 08 сентября 2010

В моем коде я перегрузил операторы new и delete, чтобы получить имя файла и номер строки. В моем коде я использую map и stack. Когда я удаляю определенное значение из карты, он просто вызывает мою перегруженную функцию delete, но я хочу, чтобы только явные операторы delete могли иметь доступ к моей функции, а не другие. Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2010

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

Как

#define DELETE_MY_OBJECT(obj) DeleteMyObject(obj, __FILE__, __LINE__)

, и метод может выглядеть как

void DeleteMyObject(void* obj, char* file, char* line)
{
    // Log delete
    ...

    delete obj;
}

тогда в вашем коде

MyObj* obj = ...
...
DELETE_MY_OBJECT(obj);
1 голос
/ 08 сентября 2010

map и stack явно вызывают delete yourObject под капотом, для большинства определений «явных» - вот почему ваш оператор удаления вызывается.Эти удаления не менее законны, чем те, что в вашем коде.

Кстати, как вы узнаете имя файла и номер строки?Помните, что __FILE__ и __LINE__, вероятно, не будут работать.Они вернут имя файла и номер строки, по которой они найдены, то есть вы получите местоположение вашего delete метода, а не местоположение вызывающей стороны .

Чтобы получить желаемое поведение, регистрируя только «явные» удаления и отслеживая их местоположение, вам нужно заменить удаления, которые вы хотите зарегистрировать, на вызовы макросов.В этом случае вам не нужно переопределять delete.Например:

#define DELETE(p) \
    do { \
        std::cout << __FILE__ << ":" << __LINE__ << ": " << p << std::endl; \
        delete p; \
    }
...