Освобождение памяти для указателя на символ - PullRequest
0 голосов
/ 11 марта 2020

Часть из моего кода:

class Menuitem
{
private:
    char* text;

    friend class Menu;
};

class Menu
{
private:
    char* title;
    Menuitem* items;
    int identation = 0;
    int amount = 0;
};

Если я сделаю delete[] items, удастся ли также безопасно удалить text, сохраненный в items? Или мне нужно удалить их отдельно?

1 Ответ

3 голосов
/ 11 марта 2020

Если я сделаю delete[] items, будет ли он также безопасно удалять текст, сохраненный в items?

Не с опубликованным кодом.

Или мне нужно delete их отдельно?

Да.

Если вы пытаетесь узнать, как работает распаковка / освобождение памяти, полезно понять проблемы и изучить как правильно использовать new и delete. Важно знать о правиле трех и соблюдать его при управлении динамической c памятью.

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

class Menuitem
{
  private:
    std::string text;  // No char*

    friend class Menu;
};

class Menu
{
  private:
    std::string title;  // No char*
    std::vector<Menuitem> items; // No MenuItem*
    int identation = 0;
    int amount = 0;
};

Тогда в коде приложения возникнет меньше проблем.

...