c ++一些堆栈和堆的理解

时间:2014-09-18 08:42:31

标签: c++ object stack heap

亲切的,要回答的一些问题以及要求确认或修改的陈述。 我想确保我做对了,我感谢任何提示。此外,我可以想象这些示例作为一个整体对C ++初学者有一些价值。

  1. 堆栈已启动对象

  2. MyClass c(10);
    MyClass c = MyClass(10);
    

    据我所知,这两个对象初始化可以互换使用,对吗?   此外,当它们超出范围时,它们会自动清理,例如从函数返回。

    1. 堆启动对象

    2. MyClass* c = new MyClass(10);
      

      此对象需要手动清理,例如“删除c”。

      1. 对象错误功能

      2. MyClass* getObj() {
                MyClass c(10); // stack initiated object
                return &c;
        }
        

        这将返回指向我的堆栈范围的MyClass对象的指针(因为我没有使用new关键字)。 事实上,我不应该使用返回给它的指针,因为在使用时对象可能已被清理或稍后失败。正确吗?

        1. 有效的对象复制功能

        2. MyClass getObj() {
                  MyClass c(10); // stack initiated object
                  return c;
          }
          

          在这种情况下,堆栈启动对象的副本将返回对调用者范围有效,对吗?

          提前谢谢。

          亲切的问候, 赫尔曼

1 个答案:

答案 0 :(得分:2)

1°)是的,但是如果您想要安全,则不应使用MyClass a(10);语法,因为您可能会遇到most vexing parse个问题。理想情况下,您可以使用以下语法(假设c ++ 11)表示初始化而没有任何歧义:

MyClass a{10};

2°)是的。但是你应该依赖RAII并尽可能地使用智能指针并且想要分配资源。

3°)这很糟糕,因为返回的指针指向离开函数时自动释放的内存(当本地对象c被破坏时)。

4°)是的,但更好的是,使用named value return optimization,你甚至不应该得到一个副本,因为编译器通常很聪明,看不到破坏本地对象并返回副本没有意义