Программы и методы для обнаружения, когда указатель выходит из области видимости - PullRequest
3 голосов
/ 21 апреля 2011

Я - стажер по программному обеспечению, работаю над большим проектом на C ++, и я также являюсь командой One Man. Устрашающий (это то, как вы пишете это: P), да, но также весело.

Я сталкиваюсь с указателями c ++, которые в конечном итоге указывают на NULL (не потому, что память освобождена / удалена, а потому, что, на самом деле, я не знаю, но я подозреваю, что это потому, что объекты, на которые я указываю, обновляются, таким образом, изначально назначенные указатель не указывает на правильный адрес памяти.

Как вы видите, я запутался, поэтому хочу узнать о техниках или бесплатных программах , которые помогают мне определить, КОГДА и ГДЕ указатель указывает на ноль или выпадает из область действия (висячие указатели? это то, что происходит).

Может быть, я могу просто использовать простой вызов ASSERT, чтобы определить, когда указатель равен нулю?

Дополнительная информация: сейчас моя проблема в том, что у меня есть класс, в котором есть переменные-члены, которые являются указателями. Они инициализируются в конструкторе и к концу конструктора эти указатели указывают на правильные объекты. Но в реакциях на события, когда я смотрю на эти указатели, они не имеют смысла. Я могу определить это, потому что: 1. программа аварийно завершает работу и 2 отладчик затмения показывает их в виде красных полых кружков (я думаю, это означает, что они указывают на NULL или находятся вне области видимости?).

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Я бы предложил два разных инструмента:

  • Cppcheck - это статический анализатор, который просматривает ваш исходный код и пытается выявить проблемы (с указателями и си многое другое).

  • Valgrind - это инструмент времени выполнения, который отслеживает все выделения и освобождения, которые выполняет ваша программа, и гарантирует, что они все правильные.

1 голос
/ 21 апреля 2011

Вам нужна точка разрыва данных. Visual Studio определенно имеет их. У GDB определенно есть они - это может называть их как-то иначе (смотреть очки?). Я не использовал Eclipse, но, вероятно, тоже.

Таким образом, вы устанавливаете (обычную) точку останова в конструкторе, чтобы указатели были установлены правильно. Затем выберите один из указателей и установите на нем точку разрыва данных. Тогда беги. Программа остановится, когда что-то изменит значение указателя. Это покажет вам, где проблема.

1 голос
/ 21 апреля 2011

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

0 голосов
/ 21 апреля 2011

делает данные (указатели) частными и вызывает определенное использование с помощью утверждений.например:

class t_class {
public:
    /* ... */
    void invalidatePointer() {
    /* is a delete required??? */
        this->d_pointer = 0;
    }

    void setPointer(int* const p) {
        assert(p && "use invalidatePoiner");
        /* ...stuff... */
        this->d_pointer = p;
    }
private:
    int* d_pointer; /* you probably don't want a non-contained pointer here, either */
};
...