Кэширование const char * в качестве типа возврата - PullRequest
5 голосов
/ 14 октября 2008

Читал немного на моем C ++ и нашел эту статью о RTTI (Идентификация типов времени выполнения): http://msdn.microsoft.com/en-us/library/70ky2y6k(VS.80).aspx. Ну, это еще одна тема :) - Однако я наткнулся на странное высказывание в type_info -классе, а именно о ::name -методе. В нем говорится: «Функция-член type_info::name возвращает const char* для строки с нулевым символом в конце, представляющей понятное человеку имя типа. Указанная память кэшируется и никогда не должна быть непосредственно освобождена».

Как вы можете реализовать что-то подобное самостоятельно !? Раньше я довольно часто боролся с этой проблемой, так как не хочу создавать новый char массив для вызывающей стороны, поэтому до сих пор придерживаюсь std::string.

Итак, ради простоты, скажем, я хочу создать метод, который возвращает "Hello World!", назовем его

const char *getHelloString() const;

Лично я бы сделал это как-то так (Псевдо):

const char *getHelloString() const
{
  char *returnVal = new char[13];
  strcpy("HelloWorld!", returnVal);

  return returnVal
}

.. Но это будет означать, что вызывающая сторона должна сделать delete[] для моего указателя возврата: (

Спасибо заранее

Ответы [ 12 ]

0 голосов
/ 14 октября 2008

Вы не можете полагаться на GC; это C ++. Это означает, что вы должны сохранять доступную память до завершения программы. Вы просто не знаете, когда станет безопасно удалить [] его. Итак, если вы хотите создать и вернуть const char *, просто new [] и возврат Примите неизбежную утечку.

0 голосов
/ 14 октября 2008

Вероятно, это сделано с использованием статического буфера:

const char* GetHelloString()
{
    static char buffer[256] = { 0 };
    strcpy( buffer, "Hello World!" );
    return buffer;
}

Этот буфер похож на глобальную переменную, доступную только из этой функции.

...