2015-12-18 5 views
-1

Я пытаюсь освободить таблицу указателей с использованием Visual Studio 2013.Const символ ** и свободный()

const char** tableNames = malloc(NB_NAMES * sizeof(char*)); 
(...) 
free(tableNames); 

По некоторым причинам, Visual продолжает жаловаться: warning C4090: 'function' : different 'const' qualifiers

Я мог бы понять это предупреждение, если бы речь шла об освобождении const char*, так как это может быть статическое содержимое только для чтения.

Но const char** (обратите внимание на второй *)? Это таблица указателей. Сама таблица должна быть выпущена, так как она начиналась с malloc'd.

Это ошибка от Visual или я чего-то не хватает?

Примечание: Я могу отключить предупреждение, или выключить его, бросая на void* внутри free(). Но это звучит не так, если это всего лишь способ обмануть компилятор и по-прежнему подвергаться какой-либо проблеме.

Так что на самом деле вопрос заключается в том, что ошибка компилятора (и приведение к void* не должно быть необходимым)?

ответ

0

A const char** по-прежнему является указателем с квалификатором const, независимо от того, указывает ли он на примитивный тип или на другой указатель. Вот почему появляется предупреждение.

В этом случае это прекрасно, если вы нажмете бесплатно. Например:

free((void *)tableNames); 

Или:

free((char **)tableNames); 
+1

Это выглядит немного странно: рилизинг таблицы указателей (которые не являются 'const') не означает освобождение памяти, используемую' сопзИте полукоксом * 'строки. На самом деле они все еще там. Поэтому я не уверен, почему нужно учитывать классификатор 'const'. – Cyan

Смежные вопросы