использование пустого указателя в c / c ++ - PullRequest
1 голос
/ 26 февраля 2011

Эй, мне интересно, как указатели void применяются в реальном мире с точки зрения повышения безопасности и гибкости программного обеспечения. Например, я знаю, что пустые указатели, к которым они будут направлены, скрыты снаружи, что сделает программное обеспечение более безопасным. Есть ли другие причины, по которым вы бы использовали указатели void?

Ответы [ 4 ]

12 голосов
/ 26 февраля 2011

Пустые указатели не делают программное обеспечение более безопасным.

Причиной использования void * в c является форма полиморфизма - если вы не знаете, каким будет тип данных, вы можете передать void *

В C ++ меньше необходимости использовать void *, а язык запрещает использование некоторых из C

1 голос
/ 26 февраля 2011

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

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

При этомЕдинственный другой способ, которым что-то «извне» будет знать типы указателей, будет через предоставляемый вами API (вероятно, через заголовочный файл).Но это одно из преимуществ наличия API - разрешение кому-либо передавать вам указатель абсолютно не гарантирует, что вы будете использовать этот тип для внутреннего использования.

0 голосов
/ 26 февраля 2011

Даже в C нет оправдания для использования void* в том смысле, в котором вы упоминаете это.Это было бы гораздо лучше сделать с указателем на неполный тип.

typedef struct myInternal myInternal;
myInternal* getIt(void);
int doIt(myInternal*);

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

0 голосов
/ 26 февраля 2011

Типичная причина использования void * заключается в предоставлении контекста пользователю API / библиотеки. Предоставляемый контекст часто является указателем, а void * делает его непрозрачным. Проблема, с которой сталкивается разработчик библиотеки, заключается в проверке void *, когда он возвращается обратно. На самом деле, библиотека была бы лучше, если бы предоставила пользователю идентификатор, который можно было бы легче проверить без предоставления внутренних данных.

Другими словами, если вы думаете об использовании пустоты *, не надо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...