2009-07-14 2 views
2

У меня есть следующий указатель.Я правильно использую новый оператор?

char **x = NULL; 

x будет указывать на массив указателей. Правильно ли следующий код?

x = new (nothrow) (*char)[20]; 

и мы dealocate его с помощью

delete[] x; 

Является

x = (char **) malloc(sizeof(char **) * 20); 

и

x = new (nothrow) (*char)[20]; 

эквивалент?

ответ

4

Нет, этот код имеет синтаксические ошибки. Звездочка идет после имя типа, чтобы сформировать указатель на этот тип. Так что:

char* 

нет:

*char 

Это странно, что у вас есть это право на примере "C-стиле" с использованием malloc(), но не в C++.

Как многие комментаторы любезно отметили, есть и другие проблемы с malloc() и его использованием sizeof. Но, по крайней мере, он получил название типа. Лично я против повторения имен типов в malloc() вызовов, если это вообще возможно, поэтому я хотел бы написать эту версию, как это, чтобы выделить динамический массив указателей 20 символов:

char **x; 

x = malloc(20 * sizeof *x); 

Этот путь:

  1. Следует читать как «в 20 раз больше, чем x баллов», то есть в 20 раз больше, чем один указатель char *.
  2. Содержит магическую константу 20 только в одном месте.
  3. Не повторяйте какую-либо часть типа, если бы вы перешли на wchar_t **x, это все равно будет работать, а не случайно.
  4. Написано на C, так как я чувствовал, что это более естественно при обсуждении malloc(). В C++ вам нужно указать возвращаемое значение. В C вы никогда не должны этого делать.
+2

Вы лучший парсер, чем я! – xtofl

+1

Хотя он не использует его полностью правильно, потому что он создает массив из 20 символов char * s не 20 char ** s. Не то, чтобы 2 были разных размеров или чего-то еще. – Goz

+0

@unwind Мой плохой. Я просто забыл, что написал (char *) вместо (* char).
@Goz Я не понял, что ты хотел сказать. Здесь x [i] будет указывать на (char *) poniters, каждая из которых является переменной длиной строки. Надеюсь, моя декларация верна. – AppleGrew

7

Помимо указателя-указателя, упомянутого разматыванием, он эквивалентен: в обоих случаях будет выделен и удален массив из 20 символов char *.

C++ - adept warning: вместо этого используйте std::vector< std::string > :) Нет необходимости в управлении памятью.

2

Новый был введен в C++. Malloc is C.

Вы не должны смешивать и сопоставлять их ... i.e использовать не использовать что-то, что вы использовали malloc. Проверьте this статью.

1

Я бы поставил под вопрос, почему вы выделяете такую ​​вещь в первую очередь. В C++ std :: vector std :: string гораздо более вероятно, что вам нужно.