读书人

想要在函数中回到结构体类型用指针会

发布时间: 2012-10-27 10:42:26 作者: rapoo

想要在函数中返回结构体类型,用指针会导致内存泄露

C/C++ code
struct Param_Stu{    int maxIter;    double maxCorr;    double bd_sgm;    double wF;    double stepSize;};struct Log_Stu{    double corr;    double obj[3];};struct OutPut_Stu{    CvMat *itpS;    double sgm;    int nIter;    Log_Stu logs;};OutPut_Stu *test(double sgm,int nIter,CvMat *itpS,Param_Stu param){    Log_Stu logs;    logs.corr=0.1;    logs.obj[0]=0.1;    logs.obj[1]=0.2;    logs.obj[2]=0.3;    OutPut_Stu output;    output.itpS=itpS;    output.logs=logs;    output.nIter=nIter;    output.sgm=sgm;    OutPut_Stu *pot=&output;    return pot;}

代码如上,。这只是个模拟结构,实际结构中的更复杂。想问的是,应该如何设计才能顺利返回结构体指针而不发生泄露

[解决办法]
楼主的问题不是内存泄露,而是返回局部变量的地址。
C/C++ code
OutPut_Stu *test(double sgm,int nIter,CvMat *itpS,Param_Stu param, OutPut_Stu *output){    Log_Stu logs;    logs.corr=0.1;    logs.obj[0]=0.1;    logs.obj[1]=0.2;    logs.obj[2]=0.3;    output->itpS=itpS;    output->logs=logs;    output->nIter=nIter;    output->sgm=sgm;    OutPut_Stu *pot=output;    return pot;}
[解决办法]
多一个传出参数,建议返回值用int传执行状态
int test(double sgm,int nIter,CvMat *itpS,Param_Stu param, OutPut_Stu* out_XXX)
调用前初始化改参数..


[解决办法]
1. 错误的返回了局部变量地址
2. 所传参数编译室决定,那么可以传入指针
C/C++ code
void test(double sgm,int nIter,CvMat *itpS,Param_Stu param, OutPut_Stu *output);int main() {    OutPut_Stu output;    test(sgm, nIter, itpS, param, &output);}
[解决办法]

1. 直接返回结构体,这种方式只是返回局部变量的一个拷贝。

2. 可以在函数体内用new 一个结构体,然后返回它的指针,之后在外部对这块内存进行管理。

3. 使用引用参数,如3楼所说,这种方式会显得比较有好,比起第二种对内存管理要方便些。

读书人网 >C++

热点推荐