想要在函数中返回结构体类型,用指针会导致内存泄露
- 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楼所说,这种方式会显得比较有好,比起第二种对内存管理要方便些。