w*******x 发帖数: 489 | 1 刚才写程序的时候发现自己犯了错误,大家能迅速看出来哪里错了不?怎么改? ^-^
int *X=NULL;
void allocate(int *Y);
int main()
{
allocate(X);
//do something
delete [] X;
return 0;
}
void allocate(int *Y)
{
if(Y==NULL)Y=new int[10];
for(int t=0;t<10;t++)Y[t]=t;
} |
k***y 发帖数: 25 | |
k*******d 发帖数: 1340 | 3 函数调用的开始 Y = X = NULL。 然后Y指向了新分配的一个数组,但是X还是NULL啊。
用Return Y吧,没有必要把X作为参数放进去。
然后
if (X == NULL)
X = allocate(); |
w**********y 发帖数: 1691 | 4 把调用的参数改成 reference of X行不? |
g**********1 发帖数: 1113 | 5 这里调用时产生了X的copy,new 只改了copy,没有该X |
g**********1 发帖数: 1113 | |
c***g 发帖数: 472 | 7 如果do something 产生异常, 会不会有memory leak?
【在 w*******x 的大作中提到】 : 刚才写程序的时候发现自己犯了错误,大家能迅速看出来哪里错了不?怎么改? ^-^ : int *X=NULL; : void allocate(int *Y); : int main() : { : allocate(X); : //do something : delete [] X; : return 0; : }
|
J*****n 发帖数: 4859 | 8 i think u can't delet X, coz it is not initiallized by dynamic allocation.
int * X=new int;
X=NULL; |
k*******d 发帖数: 1340 | 9 改成pass-by-reference 是可以的
如果do something出异常,会有memory leak, 得有try catch block,而后在catch中
释放内存。我觉得要想方便地写exception-safe的代码,还是用smart pointer,或者
是vector这些带有自动释放内存功能的类比较好。 |
w*******x 发帖数: 489 | 10 嗯,大家眼光都很敏锐阿。。我查了好一会才发现问题所在(当然原来程序有几百行,
难找一点)
总结一下:
1.) 把allocate函数的参数改成 指针的引用。 allocate(int * & Y) 就可以了。
2.) 把allocate函数的参数改成 指向指针的指针 allocate(int ** Y), 调用的时候
传递指针的地址 &X
3.) 直接返回指针。
【在 w*******x 的大作中提到】 : 刚才写程序的时候发现自己犯了错误,大家能迅速看出来哪里错了不?怎么改? ^-^ : int *X=NULL; : void allocate(int *Y); : int main() : { : allocate(X); : //do something : delete [] X; : return 0; : }
|
c****2 发帖数: 31 | 11 void allocate(int *Y) is wrong. According to the problem. Y is the address
of int array, So it is pointer to pointer, in another word: *Y is the
address of first element of int array. If you want to change it through a
function, the function needs to be defined as double pointer. |