【问题标题】:Passing pointers and more传递指针等
【发布时间】:2015-05-04 09:25:27
【问题描述】:

一般来说,我总是通过我创建的任何对象的函数传递指针;如果我需要对一个对象做些什么,我会通过指针而不是引用传递它。这只是一种编程习惯,有些人可能将其描述为微不足道。但这是我必须举例问的地方:

class someObject
{
   public:
      someObject();
      ~someObject();

      void do(const char* smth)
      {
          cout << smth << endl;
      }

   private:
};

class doObject
{
    public:
       doObject();
       ~doObject();

       void takeObject(someObject *so)
       {
           pObject = so;
           so->do("Hi");
       }

    private:
       someObject *pObject;
}

在 main.cpp 中:

int main()
{
    someObject *so = new someObject();
    so->do();

    doObject *do = new doObject();
    do->takeObject(so);

    delete so;
    delete do;
}
  1. 是否应该在为 doObject::pObject 分配指针参数 so 类型为 someObject 之前为其分配内存?

  2. 如果pObject被赋值为上述参数,是否应该删除;例如删除 pObject?

  3. 在 main.cpp 中 someObject 在 doObject 之前被删除。理解这一点至关重要,因为 doObject 有一个名为 pObject 的 someObject 分配。在 doObject 之前删除 someObject 意味着有一个悬空指针,这意味着对它的任何操作都会产生分段错误。

  4. 如果我首先在 main.cpp 中删除 doObject,是否也会删除 pObject 以及 someObject 类型的“so”?毕竟,它们是联系在一起的。

  5. 如果我创建一个新类,该类也是一个还需要 someObject 参数的函数,这是否意味着 pObject 不再指向“so”?我是否应该改用共享指针,以便两个类都可以指向“so”并根据需要更改对象?

  6. 如何改进代码?我是否应该考虑使用智能指针来确保我不会在程序的各个部分多次删除一个对象?

是的,这个问题相当复杂;但这就是你用指针得到的!

【问题讨论】:

  • 这是一个问题中的很多问题。另外:你不能调用方法或变量do,它是一个关键字。始终确保像这样的简短示例至少可以编译......否则它会掩盖对话!
  • 使用智能指针避免自己管理内存。
  • @Poriferous “是的,这个问题相当复杂;” 不,这个设计看起来相当有缺陷。 “但这就是你用指针得到的!” 没错。您不会在严肃的 C++ 编程中使用它们。
  • 神圣的汉娜!请每个问题一个 问题。线索就在“问题”这个词中......
  • 所有问题都捆绑在一起;这比发送所有相关的垃圾邮件问题要好。我确实在问题中输入了“等等”。不管怎样,我会尝试用智能指针改进代码,看看效果如何。

标签: c++ function pointers memory memory-management


【解决方案1】:
  1. 是否应该在为 doObject::pObject 分配指针参数 so 类型为 someObject 之前为其分配内存?

内存在main 中分配,指向该内存的指针分配给so。成员变量pObject 将与so 指向同一个对象。所以内存在你分配成员​​指针变量之前分配的。

  1. 如果pObject被赋值为上述参数,是否应该删除;例如删除 pObject?

必须有人删除指向的对象才能避免内存泄漏。要么有人 这样做,要么所有权是共享。当您将指针传递给另一个函数时,您决定是否转移所有权。保持一致是关键,使用智能指针会有所帮助。

  1. 在 main.cpp 中 someObject 在 doObject 之前被删除。理解这一点至关重要,因为 doObject 有一个名为 pObject 的 someObject 分配。在 doObject 之前删除 someObject 意味着有一个悬空指针,这意味着对它的任何操作都会产生分段错误。

如果您分配动态内存,请始终以相反的分配顺序解除分配,以防止悬空指针。

  1. 如果我首先在 main.cpp 中删除 doObject,是否也会删除 pObject 以及 someObject 类型的“so”?毕竟,它们是相互关联的。

没有。如果doObject 析构函数完成了delete pObject;,那么它会。

  1. 如果我创建一个新类,该类也是一个还需要 someObject 参数的函数,这是否意味着 pObject 不再指向“so”?我是否应该改用共享指针,以便两个类都可以指向“so”并根据需要更改对象?

pObject 指向so,它与so 指向同一个动态分配的对象。指向该对象的任意数量的指针可以存在于任意数量的类中,但您有责任确保在对象被删除后,没有指向它的指针的持有者使用该指针。这就是为什么以正确的顺序删除对象很重要的原因。

  1. 如何改进代码?我是否应该考虑使用智能指针来确保我不会在程序的各个部分多次删除一个对象?

是的,如果您想共享所有权 (shared_ptr) 或确保只有一个所有者 (unique_ptr),或者希望指针参数 指代,则可以使用智能指针一个实例,从不拥有。

尽可能使用自动实例而不是动态实例。

【讨论】:

  • No.4 不正确。删除 doObject 不会删除 someObject。
【解决方案2】:
  1. 如何改进代码?我是否应该考虑使用智能指针来确保不会在程序的各个部分多次删除一个对象?

我建议先学习手动内存管理,一旦你掌握了它,然后就开始使用智能指针。但是,如果您认为不需要了解手动内存管理,当然可以直接跳入智能指针。

【讨论】:

  • 我会推荐与此建议完全相反的内容。
  • 我认为智能指针之前学习MMM没有任何正当理由。
  • @LightnessRacesinOrbit 很有趣。想解释一下原因吗?
  • 这很容易解释。你可以把这个问题转过来:“你是否应该考虑在程序的不同部分中多次删除一个对象?” (同样值得注意的是:你也不愿意解释你的建议)
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 2020-08-16
  • 1970-01-01
  • 2013-04-03
  • 2013-10-25
  • 2015-03-28
  • 2022-01-12
  • 2014-04-07
相关资源
最近更新 更多