Как я могу узнать количество выделенной памяти под массив char? (Динамическая память)

Как мне узнать количество char-ов которые выделены с помощью new??


Ответы (2 шт):

Автор решения: NekitKuzmenko

Можно использовать strlen(char_arr), это выдаёт количество именно использованных char а не выделенных. Так-же можете попробовать sizeof(char_arr) / sizeof(char), но это работает только при создании массива таким образом: char str[10];.

И да, для использования strlen должна быть подключена библиотека iostream либо string, но если вы не хотите их использовать, вот простенький аналог:

char* str = new char[11];
arr = "test";

int len = 0;

for(int i = 0; ; i++) {
    if(arr[i] != NULL) len++; else break;
}

Переменная len будет содержать количество ** использованных** символов в этом char массиве.

→ Ссылка
Автор решения: LShadow77

Насколько мне известно (но я могу ошибаться) не существует документированного способа узнать размер динамически выделенного массива по его указателю. Соответственно, возможны следующие варианты:

  1. Вместе с указателем на массив сохранять размер последнего в переменной. Например:

    char* pMyArray = new char[NUM_CHARS];

    int myArrayLen = NUM_CHARS;

  2. Следует из (1) - использовать класс-обёртку, представляющий пару "указатель на массив, размер массива". Например, в черновом варианте это может выглядеть так:

     template <typename T=char>
     class CDynamicArray
     {
         T* m_pData;
         int m_length;
    
     public:
         CDynamicArray()
         {
             m_pData = nullptr;
         }
    
         T* Create(int length)
         {
             m_pData = new T[length];
             m_length = length;
             return m_pData;
         }
    
         void Delete()
         {
             if (m_pData)
             {
                 delete[] m_pData;
                 m_pData = nullptr;
             }
         }
    
         T* GetData()
         {
             return m_pData;
         }
    
         int GetLength()
         {
             return m_length;
         }
    
         ~CDynamicArray()
         {
             Delete();
         }
    
         CDynamicArray(const CDynamicArray&) = delete;
     };
    
  3. Не изобретать велосипед, а использовать уже готовое решение std::vector(https://en.cppreference.com/w/cpp/container/vector).

→ Ссылка