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; }
1
hailongs OP 我如果想释放 s1 这个,有方法释放吗?
|
2
hailongs OP 不想传入的是指针,就想以一个对象穿进去。
|
3
hailongs OP 问题是这样的,我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间?
|
4
zdt3476 2017-03-21 19:16:54 +08:00
在 test 中 new 就在 test 中 delete.
|
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 出来的堆空间。运行起来是肯定会有问题的。 |
6
laoyur 2017-03-21 19:34:29 +08:00
排版真垃圾,看着累死了
> 我如果想释放 s1 这个,有方法释放吗? 想在 main 中释放 test 函数 new 出来的那个 s ?照你现在的实现,没办法。 > 我有一个对象,对象的引用传入一个函数中,这个函数会重新帮我 new 空间,那我调用结束后,如何释放函数里 new 的空间? 通常的做法是传指针的指针进去,才能在函数调用结束后释放函数里 new 出来的对象。 |
7
taozhijiangscu 2017-03-21 20:40:46 +08:00
这代码真 2333
|
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 真的是没落了...... |
9
radiolover 2017-03-21 20:53:50 +08:00
忘记替换了,把上面的 pSObj 全部换成 psRef
|
10
tieshu 2017-03-21 22:19:32 +08:00
函数直接传入引用不就好,这样就不用 new 一个对象了。或者直接传入一个空的指针对象。
|
11
owt5008137 2017-03-22 08:59:46 +08:00 via Android
test 函数参数改成 s*&或者 s**
|
12
araraloren 2017-03-22 09:00:20 +08:00
@hailongs
没有办法手动释放,栈你能做的只有分配空间 仔细理解一下 对象和指针, c++ 对象不是其他引用语言的对象 栈上的空间 和 你用 new 分配的空间 是没有什么不同的,如 4 楼所说 ,你在 test 内申请就在 test 内释放 根据你的描述,感觉你没有理解 c++的对象和指针。。 |