【问题标题】:Memory deallocation for char pointerchar 指针的内存释放
【发布时间】:2020-06-23 20:55:43
【问题描述】:

部分来自我的代码:

class Menuitem
{
private:
    char* text;

    friend class Menu;
};

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

如果我这样做delete[] items,它是否也会安全地删除保存在items 中的text?还是需要单独删除?

【问题讨论】:

  • 您需要为您之前执行的每个new 执行一个delete。特别是,delete 不会自动为您删除任何子分配(您需要自己处理这些,通常在您的类的析构函数中)。更好的是,尽可能完全避免 newdelete,并使用例如std::string 代替。这样你的生活就会少很多痛苦。
  • 如果你真的必须使用char*,请使用智能指针。
  • @Dr_Cringe 至少您可以为 Menuitem 类编写析构函数。有什么问题?
  • 从 C++11 开始,不需要 new/delete。将 std::shared_ptr 与 std:string 一起使用。
  • 我很难看到 std::shared_ptr 会带来什么 std::unique_ptr @Werner

标签: c++ memory-leaks dynamic-memory-allocation


【解决方案1】:

如果我这样做delete[] items,它是否也会安全地删除保存在items 中的文本?

与发布的代码无关。

或者我需要单独delete他们吗?

是的。

如果您尝试了解内存分配/释放的工作原理,最好了解这些问题并学习如何正确使用newdelete。 在管理动态内存时,必须了解 The Rule of Three 并遵守它。

如果您试图让应用程序处于工作状态,最好避免使用原始指针。使用标准库中的容器。

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;
};

这样,您不必担心应用程序代码中的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2017-03-01
    • 2013-06-30
    相关资源
    最近更新 更多