Различать указатель и ссылку во время выполнения ANSI C ++ - PullRequest
1 голос
/ 26 марта 2009

Как можно различить указатели и ссылки во время выполнения? Например, если бы я хотел освободить указатель типа данных, не зная, является ли он указателем или нет, как бы я это сделал? Есть какой-нибудь метод, чтобы сказать, была ли переменная размещена в стеке или через malloc ()?

void destInt(int* var)
{
   free(var);
}


int num = 3;
int &numRef = num;
int* numPtr = (int*)malloc(sizeof(int));
*numPtr = num;

destInt(&numRef); //Syntactically correct but generates invalid pointer()
destInt(numPtr); //Fine syntactically and logically

Ответы [ 5 ]

7 голосов
/ 26 марта 2009

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

РЕДАКТИРОВАТЬ: также обратите внимание, что C не имеет ссылок. & -Оператор в C используется для получения адреса переменной.

4 голосов
/ 26 марта 2009

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

Часто адрес кучи «маленький» и растет, а стек «большой» и уменьшается, но это только эвристический и непереносимый объект.

1 голос
/ 26 марта 2009

Что бы вы ни пытались достичь ... не делайте так.

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

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

1 голос
/ 26 марта 2009

В C ++ информация, различающая, является ли она ссылкой или указателем , является частью информации о типе во время компиляции . В Си это несущественное различие в семантике.

Если вам нужно использовать &, чтобы получить адрес чего-либо, , тогда вы не можете delete или освободить его. В противном случае, если вы передаете указатель, вам необходимо задокументировать, какие функции право delete или освободить его. Самый простой способ сделать это в C ++ - использовать класс интеллектуальных указателей, такой как shared_ptr или scoped_ptr.

0 голосов
/ 26 марта 2009

При использовании malloc память выделяется НЕ в СТЕКЕ, а в куче.

...