由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个c++在不同函数里分配内存和释放内存的弱问题
相关主题
c++ 弱问题:static const char* const 这两个const 分别是什么意思?菜鸟求教,一个c++的困惑
pointer to function一个简单的小问题
const char *p, is it ok to change p[1] ?问个C++中重复删除指针的问题
Please help me take a look at the programnew了指针,delete的时候出错了
new and delete in c++[求教大虾]关于C++编译期变量和运行期变量的区别,总是有疑惑
如何动态分配内存来存储输入的不定长的字符串,char not string类型的一个hash table的简单问题
Array in CC++编程原则的问题
为什么foo1可以而foo2不行?问一个关于C++指针的问题
相关话题的讨论汇总
话题: int话题: pointer话题: delete话题: char话题: double
进入Programming版参与讨论
1 (共1页)
m****s
发帖数: 1481
1
我需要读取一个数据文件,然后把读出来的数据放到不同的变量里,因为这些变量的长
度不确定,所以都是临时根据长度分配内存,code如下:
... main(){
...
...
int *a,length_a;
double *d,length_d;
char *c,length_c;
FILE *fp;
... 打开文件代码...
...读文件,获取变量a,d,c的长度...
a= new int[length_a];
d= new double[length_d];
c= new char[length_c];
...计算,处理...
delete[] a;
delete[] d;
delete[] c;
}
这种最基本的方法运行没问题。
现在因为我要load的变量很多,所以我想把loading用一个函数来做。如果只有一个变
量,我可以把它的pointer定义在main里面,然后用一个函数读取文件,在函数里
declare一个临时pointer,分配内存,赋值,然后返回这个pointer。
但是如果多个变量的情况怎么做呢?
我先试了把多个变量的指针传递给子函数,在子函数里declare对应的临时pointer,分
配内存,赋值,然后把传进来的pointer指向这些临时pointer,但是不对。code 如下:
main(){
int *a;
double *d;
char *c;
fun_read(a,d,c);
delete[] a;
delete[] d;
delete[] c;
}
void fun_read(int *a, double *d, char *c){
int *at;
double *dt;
char *ct;
...读文件,然后给at,dt,ct分配空间,赋值,处理...
a=at;
d=dt;
c=ct;
}
我又试了在main里先给a,d,c分配空间,然后在子函数里删除,在把他们指向临时pointer,返回,也不对。
然后我又试了定义一个structure,里面包含所有这些pointer,在main里declare一个这样structure的pointer,不分配,然后子函数去读文件,declare一个临时structure pointer存变量,然后返回这个pointer给main。code如下:
structure pack{
int *a;
double *d;
char *c;
};
main(){
pack *p1;
p1=fun_readpack();
...处理...
delete[] p1;
}
pack *fun_readpack(){
pack *tmp;
...读文件,获取变量长度length_a,length_d,length_c...
tmp->a=new int[length_a];
tmp->d=new double[length_d];
tmp->c=new char[length_c];
...赋值...
return tmp;
}
这样可以工作,但是我需要在主程序里delete这个structure的每一个成员pointer么?还是只要delete这个structure的pointer就好了?
总结起来我的问题就是,怎么正确的在main里declare多个各种类型的pointer,用一个
子函数给这些pointer分配内存和赋值(分配多少空间main不知道,子函数决定),然
后返回给main处理,(还要给其他子函数处理),末了在main里删除掉。
不知道说明白乐没有,谢谢先
D*****r
发帖数: 6791
2
我觉得应该用引用,
void func_read(int * &a, double * &d, char * &c){
...
}
这应该是个形参、实参的问题吧?

【在 m****s 的大作中提到】
: 我需要读取一个数据文件,然后把读出来的数据放到不同的变量里,因为这些变量的长
: 度不确定,所以都是临时根据长度分配内存,code如下:
: ... main(){
: ...
: ...
: int *a,length_a;
: double *d,length_d;
: char *c,length_c;
: FILE *fp;
: ... 打开文件代码...

m****s
发帖数: 1481
3
谢谢,我刚才搜索了半天,看到stackoverflow有人问类似的问题,确实是应该用引用
。因为c++子函数传进来的变量是copy,所以进来的pointer是主函数那个pointer的
local copy,如果主函数没有初始化,子函数分配的内存并没有赋值给主函数的
pointer,一个解决办法是子函数用int **a,主函数把没有分配内存的pointer的地址
传进去,也就是call的时候用&a。另一个办法就是你说的用int * &a,pass by reference。
m****s
发帖数: 1481
4
还是有点问题,大侠帮忙看下下面的代码,为什么在main里释放内存出错。
用pass by reference:
void fun1(int& *a, double& *b, char& *c){

a=new int[20];
b=new double[20];
c=new char[10];
for (int i=0;i<20;i++){
a[i]=i;
b[i]=sqrt((double)a[i]);
}
c="0123456789";
}
int _tmain(int argc, _TCHAR* argv[])
{
int *a;
double *b;
char *c;
fun1(a,b,c);
cout<<"a & b are:"< for(int i=0;i<20;i++)
cout< cout<<"c is: "< delete[] a;
delete[] b;
delete[] c;
return 0;
}
用pointer to pointer:
void fun1(int **a, double **b, char **c){

*a=new int[20];
*b=new double[20];
*c=new char[10];
for (int i=0;i<20;i++){
(*a)[i]=i;
(*b)[i]=sqrt((double)((*a)[i]));
}
*c="0123456789";
}
int _tmain(int argc, _TCHAR* argv[])
{
int *a;
double *b;
char *c;
fun1(&a,&b,&c);
cout<<"a & b are:"< for(int i=0;i<20;i++)
cout< cout<<"c is: "< delete[] a;
delete[] b;
delete[] c;
return 0;
}
两种方法都能正确赋值和返回main,但是delete[]出错。
m****s
发帖数: 1481
5
搞明白了,问题出在char*被重定向到一个string上去了,惭愧,低级错误啊
s*w
发帖数: 729
6
int & *a 和 int * &a 没区别吗?
t****t
发帖数: 6806
7
there is no "int&*a".

【在 s*w 的大作中提到】
: int & *a 和 int * &a 没区别吗?
H***a
发帖数: 735
8
既然在C++里, 还是用vector会省心点吧 :)
c********5
发帖数: 61
9
你这个还停留在C语言的思维啊. C++里通常的办法是自己写个class把数据包装在一个
object里, 这样内存分配和释放都很好管理. 如果数组里的数据类型相同的话象楼上说
的用vector之类现成的class就好了.
1 (共1页)
进入Programming版参与讨论
相关主题
问一个关于C++指针的问题new and delete in c++
C++编程问题:union inside struct如何动态分配内存来存储输入的不定长的字符串,char not string类型的
刚看完类这一章,有些大小问题,请指教,谢谢Array in C
问个char * 的问题为什么foo1可以而foo2不行?
c++ 弱问题:static const char* const 这两个const 分别是什么意思?菜鸟求教,一个c++的困惑
pointer to function一个简单的小问题
const char *p, is it ok to change p[1] ?问个C++中重复删除指针的问题
Please help me take a look at the programnew了指针,delete的时候出错了
相关话题的讨论汇总
话题: int话题: pointer话题: delete话题: char话题: double