V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hailongs
V2EX  ›  C

帮忙看下内存问题

  •  
  •   hailongs · 2017-03-21 18:57:49 +08:00 · 2323 次点击
    这是一个创建于 2786 天前的主题,其中的信息可能已经有所发展或是发生改变。

    typedef struct { int a; int b; } s;

    class TTT { public : static void test(s *s1) { s1 = new s; }

    }; int main() { s s1; TTT::test(&s1); s* s2 = &s1; delete s2; return 0; }

    12 条回复    2017-03-22 09:00:20 +08:00
    hailongs
        1
    hailongs  
    OP
       2017-03-21 18:58:24 +08:00
    我如果想释放 s1 这个,有方法释放吗?
    hailongs
        2
    hailongs  
    OP
       2017-03-21 18:58:52 +08:00
    不想传入的是指针,就想以一个对象穿进去。
    hailongs
        3
    hailongs  
    OP
       2017-03-21 19:04:41 +08:00
    问题是这样的,我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间?
    zdt3476
        4
    zdt3476  
       2017-03-21 19:16:54 +08:00
    在 test 中 new 就在 test 中 delete.
    wevsty
        5
    wevsty  
       2017-03-21 19:30:24 +08:00
    这代码真心不知道怎么吐槽比较好。。。
    如果想传入的是对象的引用,那么函数定义应该是这样的。
    static void test(s &s1){}
    自己 new 出来的东西就必须自己 delete 或者干脆用智能指针。
    然后楼主这代码本身就有很大的问题。

    test 函数里 new 出来的对象赋值给函数参数 s1 并不影响 main 函数里面的 s1 。所以你最后试图 delete 的是 main 函数里面的栈空间而不是 new 出来的堆空间。运行起来是肯定会有问题的。
    laoyur
        6
    laoyur  
       2017-03-21 19:34:29 +08:00
    排版真垃圾,看着累死了

    > 我如果想释放 s1 这个,有方法释放吗?
    想在 main 中释放 test 函数 new 出来的那个 s ?照你现在的实现,没办法。

    > 我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间?
    通常的做法是传指针的指针进去,才能在函数调用结束后释放函数里 new 出来的对象。
    taozhijiangscu
        7
    taozhijiangscu  
       2017-03-21 20:40:46 +08:00
    这代码真 2333
    radiolover
        8
    radiolover  
       2017-03-21 20:53:06 +08:00
    传入指针的引用就可以了:
    s *s1 = NULL;
    s *&psRef = s1;
    TTT::test(pSObj);
    if (pSObj)
    {
    delete pSObj;
    pSObj = NULL;
    }
    // 这种低级问题怎么会出现在 V2EX? V2EX 真的是没落了......
    radiolover
        9
    radiolover  
       2017-03-21 20:53:50 +08:00
    忘记替换了,把上面的 pSObj 全部换成 psRef
    tieshu
        10
    tieshu  
       2017-03-21 22:19:32 +08:00
    函数直接传入引用不就好,这样就不用 new 一个对象了。或者直接传入一个空的指针对象。
    owt5008137
        11
    owt5008137  
       2017-03-22 08:59:46 +08:00 via Android
    test 函数参数改成 s*&或者 s**
    araraloren
        12
    araraloren  
       2017-03-22 09:00:20 +08:00
    @hailongs
    没有办法手动释放,栈你能做的只有分配空间

    仔细理解一下 对象和指针, c++ 对象不是其他引用语言的对象

    栈上的空间 和 你用 new 分配的空间 是没有什么不同的,如 4 楼所说 ,你在 test 内申请就在 test 内释放

    根据你的描述,感觉你没有理解 c++的对象和指针。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3202 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:35 · PVG 20:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.