ivanlw
V2EX  ›  C

把一个 Class/Struct 实例化成普通对象,和通过 new 实例成一个指针有什么不同吗?

  •  
  •   ivanlw · Feb 19, 2014 · 1749 views
    This topic created in 4501 days ago, the information mentioned may be changed or developed.
    比如:
    struct Node
    {
    int val;
    Node(int v) : val(v) {}
    };
    int main()
    {
    Node *a = new Node(3); //这样子
    Node b(5); //和这样子
    return 0;
    }

    目前知道的就是new是在heap上分配的,效率可能低一些;还有b的那种方式不能用->的指针符访问对象的元素,有什么其他实质性的不同吗?
    6 replies    1970-01-01 08:00:00 +08:00
    Wins0n
        1
    Wins0n  
       Feb 19, 2014
    要记得delete
    timothyqiu
        2
    timothyqiu  
       Feb 19, 2014
    Node *a = new Node(3) 的意思是:

    1. 在堆上创建一个 Node 对象
    2. 在栈上创建一个名为 a 的指针指向它

    Node b(3) 的意思是:

    1. 在栈上创建一个 Node 对象,名为 b


    p.s. a->val 是 (*a).val 的语法糖而已...
    ivanlw
        3
    ivanlw  
    OP
       Feb 19, 2014 via iPhone
    所以,实际中用起来应该如何选择呢?
    wog
        4
    wog  
       Feb 19, 2014
    再补充楼上的一下

    虽然a 和b 出了main的作用域都会失效,但是a指向的实体,只要不delete,会一直存在。b不用delete
    baka
        5
    baka  
       Feb 19, 2014   ❤️ 1
    一般不在栈上实例化,并且对象传参时都会使用指针形式(或c++引用),避免复制栈存储。
    另外,指针形式支持多态,可以根据虚表选择继承链上的类。
    ivanlw
        6
    ivanlw  
    OP
       Mar 11, 2014
    @baka 多谢……可是,如果在栈上实例化,那么传参的时候也可以用引用的吧?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3119 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 13:11 · PVG 21:11 · LAX 06:11 · JFK 09:11
    ♥ Do have faith in what you're doing.