Получите номер строки вызываемой функции - PullRequest
2 голосов
/ 15 декабря 2010

Пожалуйста, дайте мне знать, могу ли я это сделать или нет?

Я пишу библиотеку, которая могла бы работать для отслеживания выделения и удаления памяти в C ++. Короче говоря, я пытаюсь проверить, нет ли в моем приложении утечек памяти. Это то, что я сделал до сих пор.

Переопределить операторы new и delete и сейчас. Всякий раз, когда приложение использует новый, я планирую сохранить адрес и количество байтов, выделенных в этом вызове. Точно так же, когда удаление вызывается по этому адресу, я удаляю его из сохраненного списка. До сих пор это хорошо. Но я хочу сохранить имя файла и номер строки, откуда называется «новый». Я могу сделать это только в переопределенном новом. Есть ли способ получить номер строки в переопределенной функции?


1    int main()
2    {
3       // Say, A is a structure
4        A *a = new A();
5        return 0;
6     }
7    void* operator new( size )
8    {
9        //
10       // store the line number and file name on line 4 ??? Can I do it?
11       return (malloc(size));
12   }
------------------------

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

макросы __LINE__ дает номер строки но также __FUNCTION__ и __FILE__ действительно полезны, предоставляя const char * включающей функции и имя файла. edit: (__FUNCTION__ не является стандартным, но поддерживается несколькими компиляторами) Но к сожалению эти макросы только принимают свое значение на месте. Поэтому вы не можете попросить звонящего.

Вы должны писать макросы __LINE__ и __FILE__ везде, где вы используете new. :. (

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

1 голос
/ 15 декабря 2010

Наконец-то я получил ответ от одной из похожих тем на этом форуме ... Следующий код сработал ... Допустим,

class A
{
    public:
    char str[1000];
    A()
    {
        strcpy(str,"Default string");
    }
    A(const char* s)
    {
        strcpy(str,s);
    }
};

void * operator new (unsigned size, char const * file, int line)
{
    cout << "File = " << file << endl;
    cout << "Line = " << line << endl;
    return( malloc(size));
}
#define new new(__FILE__, __LINE__)
int main()
{
    A *a = new A("Leak");
    printf("%s",a->str);
    delete a;
    return 0;
}

Связанный пост, где я нашел ответ ... перегрузка нового и удаление в c ++

0 голосов
/ 16 декабря 2010

Вы можете использовать функцию проверки времени выполнения dbx в студии для выявления утечек памяти в Solaris (http://blogs.oracle.com/janitor/entry/runtime_memory_checking.). Libumem также может быть очень полезным (http://blogs.oracle.com/pnayak/entry/finding_memory_leaks_within_solaris.)

...