C++ 删除作为公共类成员的指针

C++ 删除作为公共类成员的指针,c++,pointers,C++,Pointers,我有一个结构/类,其成员是指针 struct myStruc { int* m_p; } 1。问题:我应该在哪里删除指针?在析构函数中 myStruct::~myStruct() { delete m_p; } 2。问题:如果指针被分配到指针数组,例如 myStruct mS; mS.m_p = new int[3]; 如果我必须执行delete或delete[],现在有没有一个好方法(没有动态播放或尝试捕获) 理想情况下,在析构函数中。但要遵循规则 您应该使用delete

我有一个结构/类,其成员是指针

struct myStruc
{
    int* m_p;
}
1。问题:我应该在哪里删除指针?在析构函数中

myStruct::~myStruct()
{
    delete m_p;
}
2。问题:如果指针被分配到指针数组,例如

myStruct mS;
mS.m_p = new int[3];
如果我必须执行
delete
delete[]
,现在有没有一个好方法(没有动态播放或尝试捕获)

  • 理想情况下,在析构函数中。但要遵循规则
  • 您应该使用
    delete[]
    new/new[]
    应分别使用
    delete/delte[]
  • 理想情况下,在析构函数中。但要遵循规则
  • 您应该使用
    delete[]
    new/new[]
    应分别使用
    delete/delte[]

  • 理想情况下,您根本不应该使用原始指针成员。您有两个更好的选择:

  • 使用
    std::vector
  • 使用智能指针作为成员和 如果不能使用智能指针,必须使用原始指针,则:

    • 如果使用
      new
      分配指针,则使用
      delete
      ,如果使用
      new[]
      则需要使用
      delete[]
      。不应该有不匹配
    • 每次动态分配的成员生命周期结束时,您都需要调用
      delete
      delete[]
      。假设此成员的生存期与类的生存期相同,它将位于析构函数中
    • 重要的是你应该遵循

      • 理想情况下,您根本不应该使用原始指针成员。您有两个更好的选择:

      • 使用
        std::vector
      • 使用智能指针作为成员和 如果不能使用智能指针,必须使用原始指针,则:

        • 如果使用
          new
          分配指针,则使用
          delete
          ,如果使用
          new[]
          则需要使用
          delete[]
          。不应该有不匹配
        • 每次动态分配的成员生命周期结束时,您都需要调用
          delete
          delete[]
          。假设此成员的生存期与类的生存期相同,它将位于析构函数中
        • 重要的是你应该遵循
        您不应该允许“用户”干扰数据结构中的指针。将指针设为私有,并使用get/set函数访问它

        因此:

        编辑:上面的类不完整,它显示的是概念。对于一个完整的类,您需要一个复制构造函数和赋值运算符,并且可能需要从
        allocate
        函数中“记住”
        n

        现在你再也不用担心你是否分配了[],因为它是一致的

        当然,您可以使用std::vector来实现这一点,而无需任何额外的努力。

        您不应该允许“用户”干扰数据结构中的指针。将指针设为私有,并使用get/set函数访问它

        因此:

        编辑:上面的类不完整,它显示的是概念。对于一个完整的类,您需要一个复制构造函数和赋值运算符,并且可能需要从
        allocate
        函数中“记住”
        n

        现在你再也不用担心你是否分配了[],因为它是一致的


        当然,您可以使用
        std::vector
        来实现这一点,而无需任何额外的努力。

        A/方法是在构造函数中分配内存,并在析构函数中取消分配内存。您能详细介绍一下该用例吗?myStruc的目的是什么?谁在设置m\p?穆普指的是什么?谁决定并知道这一点?@DaveRager虽然这是一个很好的一般建议,
        struct
        通常只是一个没有太多附加功能的数据集合,这些数据通常是
        公共的,因为不需要太多的封装。至少当我看到一个类被定义为
        struct
        时,我就明白了这一点。方法是在构造函数中分配内存,在析构函数中释放内存。你能告诉我更多关于这个用例的信息吗?myStruc的目的是什么?谁在设置m\p?穆普指的是什么?谁决定并知道这一点?@DaveRager虽然这是一个很好的一般建议,
        struct
        通常只是一个没有太多附加功能的数据集合,这些数据通常是
        公共的,因为不需要太多的封装。至少当我看到一个类被定义为
        struct
        时,我就明白了这一点。关于2.:现在如何使用新的int[3]?如果
        mS.m_p=new int()怎么办是否已执行<代码>删除[]
        会失败。为什么理想情况下在析构函数中?结构如何知道它是否应该删除指针,或者是否调用
        delete
        delete[]
        ?@juanchopanza在我看来,原始指针通常在析构函数中返回它的资源。我在2中回答了你评论中的删除部分。析构函数无法知道是否使用了
        new[]
        new
        。@juanchopanza如果我的陈述不明确,我很抱歉。返回获取的资源是程序员的责任。我在2中所说的是,如果程序员已经使用new/new[]获得了资源,那么必须使用相应的delete/delete[]。关于2:new int[3]已经被使用了,我该怎么做?如果
        mS.m_p=new int()怎么办是否已执行<代码>删除[]
        会失败。为什么理想情况下在析构函数中?结构如何知道它是否应该删除指针,或者是否调用
        delete
        delete[]
        ?@juanchopanza在我看来,原始指针通常在析构函数中返回它的资源。我
        struct myStruc
        {
          private:
            int* m_p;
          public:
            int* ptr() { return m_p; }
            void allocate(int n) { m_p = new int[n]; 
            myStruc() : m_p(0) {};
            ~myStruc() { delete [] m_p; }
        };