Используя “утверждают” с указателями в C++

Простой ответ Да.

для Не повторения но это не может быть сказано достаточно. У Вас ДОЛЖНО БЫТЬ управление исходным кодом. Подрывная деятельность является смехотворно легкими и почти нулевыми издержками, как только это - установка. Буквально не должно требоваться больше чем 5-20 минут для установки. У Вас есть другой выбор также, как МЕРЗАВЕЦ. Поэтому просто выберите один и поместите свой источник там - конец ответа.:)

6
задан George Stocker 10 December 2009 в 01:06
поделиться

6 ответов

Обычно вы должны использовать assert для проверки условия, которое, если оно ложно, указывает на ошибку в вашем приложении. Поэтому, если указатель NULL не должен встречаться в какой-то момент приложения, если нет ошибки, тогда подтвердите это. Если это может произойти из-за неверного ввода, вам необходимо правильно обработать ошибку.

13
ответ дан 8 December 2019 в 04:52
поделиться

Операторы ASSERT великолепны как «принудительная документация» - то есть они рассказывают читателю что-то о коде («Этого никогда не должно происходить»), а затем заставляют его, сообщая вам, неверно.

Если это что-то, что могло случиться (неверный ввод, память не может быть выделена), то не время использовать ASSERT. Утверждения только для вещей, которые не могут произойти, если все соблюдают предварительные условия и тому подобное.

Вы можете сделать это следующим образом:

ASSERT(pMyPointer);
3
ответ дан 8 December 2019 в 04:52
поделиться

По опыту, если вы утверждаете нулевые условия, которые никогда не должны происходить при нормальных условиях, ваша программа находится в действительно плохом состоянии. Восстановление из такого нулевого состояния с большей вероятностью замаскирует исходную проблему.

Если вы не запрограммировали код с учетом гарантии исключения ( linky ), я говорю, пусть он выйдет из строя, тогда вы узнаете, что у вас проблема.

2
ответ дан 8 December 2019 в 04:52
поделиться

Я бы использовал ASSERT, где нулевой указатель не будет например:

ASSERT(p);   
strcpy(p, "hello");

Немного ненужно, он просто заменяет фатальное исключение фатальным assert!
Но в более сложном коде, особенно в таких вещах, как интеллектуальные указатели, может быть полезно знать, является ли указатель тем, чем вы являетесь.

Помните, что ASSERT запускаются только в отладочных сборках, они исчезают в выпуске.

0
ответ дан 8 December 2019 в 04:52
поделиться

В C также есть функция assert .. в режиме отладки, если assert (x), условие x ложно, появится предупреждение ... Но помните, что он работает только в режиме отладки ... в режиме выпуска все функции assert пропускаются

0
ответ дан 8 December 2019 в 04:52
поделиться

Вам вообще не требуется , чтобы использовать assert для указателей. Идея состоит в том, чтобы избежать сбоев при разыменовании указателей, когда они равны нулю.

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

Что вы должны делать с указателями, так это проверять их на наличие null- ness и изящно потерпеть неудачу. Другими словами, пусть ваша функция возвращает какую-либо ошибку или ничего не делает (не все согласятся с этим подходом, но он вполне приемлем, если он задокументирован).

В моем понимании assert мнение для выявления проблем во время разработки, поэтому вы обнаружите, что assert ничего не делает в сборках релизов некоторых компиляторов. Это не заменитель защитного программирования.

Что касается того, как это сделать:

#include <assert.h>
void doSomethingWithPointer (int *p) {
    assert (p != 0);
    cout << *p << endl;
}

, но это было бы лучше сделать так:

void doSomethingWithPointer (int *p) {
    if (p != 0)
        cout << *p << endl;
}

Другими словами, даже если ваш «контракт» ( API) заявляет, что вам не разрешено получать нулевые указатели, вы все равно должны аккуратно их обрабатывать. Старая цитата: будьте консервативными в том, что вы даете, либеральными в том, что вы принимаете (перефразировано).

re не разрешено получать нулевые указатели, вы все равно должны аккуратно их обрабатывать. Старая цитата: будьте консервативными в том, что вы даете, либеральными в том, что вы принимаете (перефразировано).

re не разрешено получать нулевые указатели, вы все равно должны аккуратно их обрабатывать. Старая цитата: будьте консервативными в том, что вы даете, либеральными в том, что вы принимаете (перефразировано).

6
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: