帮忙看下内存问题

2017-03-21 18:57:49 +08:00
 hailongs

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; }

2231 次点击
所在节点    C
12 条回复
hailongs
2017-03-21 18:58:24 +08:00
我如果想释放 s1 这个,有方法释放吗?
hailongs
2017-03-21 18:58:52 +08:00
不想传入的是指针,就想以一个对象穿进去。
hailongs
2017-03-21 19:04:41 +08:00
问题是这样的,我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间?
zdt3476
2017-03-21 19:16:54 +08:00
在 test 中 new 就在 test 中 delete.
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
2017-03-21 19:34:29 +08:00
排版真垃圾,看着累死了

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

> 我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间?
通常的做法是传指针的指针进去,才能在函数调用结束后释放函数里 new 出来的对象。
taozhijiangscu
2017-03-21 20:40:46 +08:00
这代码真 2333
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
2017-03-21 20:53:50 +08:00
忘记替换了,把上面的 pSObj 全部换成 psRef
tieshu
2017-03-21 22:19:32 +08:00
函数直接传入引用不就好,这样就不用 new 一个对象了。或者直接传入一个空的指针对象。
owt5008137
2017-03-22 08:59:46 +08:00
test 函数参数改成 s*&或者 s**
araraloren
2017-03-22 09:00:20 +08:00
@hailongs
没有办法手动释放,栈你能做的只有分配空间

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

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

根据你的描述,感觉你没有理解 c++的对象和指针。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349220

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX