作者Zero0910 (みくに最高≧▽≦)
看板C_and_CPP
标题[问题] 回传过大的物件会有问题吗
时间Thu Apr 13 17:40:28 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
windows 7
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VC 6.0
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无
问题(Question):
我呼叫一个class的function回传一个大size的struct member
辅助程式会出现stack overflow
喂入的资料(Input):
无
预期的正确结果(Expected Output):
回传struct
错误结果(Wrong Output):
Stack Overflow
程式码(Code):(请善用置底文网页, 记得排版)
struct B1
{
int pp[300000];
};
class A1
{
public:
B1 b1;
B1 GetB1(){return b1;}
};
补充说明(Supplement):
class里面有一个很大的struct member : b1
呼叫A1.GetB1()取得此struct member
单纯用VC去编没事, 不呼叫A1.GetB1()也没事
但我用检查记忆体的辅助程式时
只要有呼叫A1.GetB1()就会出现stack overflow
这代表实际上回传大size是会有问题的吗?
--
因正直而受骗的人有很多
悔恨被人欺骗没关系
但不应该悔恨做一个正直的人
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.219.120.6
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492076438.A.B05.html
1F:推 FrozenMoment: 何不回传指标或参考? 04/13 18:00
有考虑过改成这种写法
只是好奇函式回传的物件size是否有上限
2F:推 james732: 那个pp在回传的时候会被copy吗? 04/13 18:09
是指有没有被assign吗?
a->b1 = b->GetB1(); //这样?
不管有没有"a->b1 = "都会出现错误
※ 编辑: Zero0910 (61.219.120.6), 04/13/2017 18:21:31
3F:推 jerryh001: 回2楼 return by value 所以会复制整个阵列 04/13 18:43
4F:→ s4300026: 签名档好熟悉啊... 04/13 19:13
5F:→ s4300026: 好奇问一下,如果array摆在外面,没被封装起来,可以使 04/13 19:14
6F:→ s4300026: 用吗? 04/13 19:14
7F:推 longlongint: 会 04/13 20:24
8F:推 Sidney0503: 十三诫 10 请看置底文 04/14 03:00
所以return的物件也是摆在stack里吗?
9F:推 TeaEEE: VC6的静态阵列不要超过65536 04/14 08:44
member variable虽然是静态的
而class object是用new allocate出来的
这样依然是不行的?
※ 编辑: Zero0910 (211.21.228.43), 04/14/2017 10:43:24
10F:推 Sidney0503: new和malloc出来的东西在heap所以用pointer传address 04/14 12:12
11F:→ Sidney0503: 你需要了解C语言和process的记忆体行为 04/14 12:13