帮忙看下内存问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hailongs
V2EX    C

帮忙看下内存问题

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

    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     Solana     2619 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 06:49 PVG 14:49 LAX 23:49 JFK 02:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86