avatar
关于malloc/free和循环# Programming - 葵花宝典
q*g
1
假设说我用malloc分配了一些内存给变量v:
double * v = (double *) malloc ( 10 * sizeof(double));
现在开始一个循环,其中v每次的值都不一样,那么我是不是需要
在循环体内free之(当然这就意味着也得再循环体内定义它)?
完整一点的例子在这里:
int main ()
{
double data[10] = {1,2,3,4, 5,6,7,8,9,10};
double * v = (double *) malloc ( 2 * sizeof(double));
int i;
for (i = 0; i < 5; i++)
{
v = &data[2*i];
printf("%f\n", v[1]);
}
return 0;
}
avatar
c*r
2
in your example, no need to allocate memory space to v.

【在 q*****g 的大作中提到】
: 假设说我用malloc分配了一些内存给变量v:
: double * v = (double *) malloc ( 10 * sizeof(double));
: 现在开始一个循环,其中v每次的值都不一样,那么我是不是需要
: 在循环体内free之(当然这就意味着也得再循环体内定义它)?
: 完整一点的例子在这里:
: int main ()
: {
: double data[10] = {1,2,3,4, 5,6,7,8,9,10};
: double * v = (double *) malloc ( 2 * sizeof(double));
: int i;

avatar
s*d
3
用指针就行了。当然动态分配也没什么不可以。至于分配和free之间,就当作一对扩号那
种关系,就不会错了

【在 q*****g 的大作中提到】
: 假设说我用malloc分配了一些内存给变量v:
: double * v = (double *) malloc ( 10 * sizeof(double));
: 现在开始一个循环,其中v每次的值都不一样,那么我是不是需要
: 在循环体内free之(当然这就意味着也得再循环体内定义它)?
: 完整一点的例子在这里:
: int main ()
: {
: double data[10] = {1,2,3,4, 5,6,7,8,9,10};
: double * v = (double *) malloc ( 2 * sizeof(double));
: int i;

avatar
q*n
4
memory leak happens because
data -> memory block 1
v -> memeroy block 2
v = data
what happens to memeory block2? it's address is lost and not accessible
anymore, thus the memory leak.
Anytime you malloc a piece of memory, you need to free it later, simple as
that.

【在 q*****g 的大作中提到】
: 假设说我用malloc分配了一些内存给变量v:
: double * v = (double *) malloc ( 10 * sizeof(double));
: 现在开始一个循环,其中v每次的值都不一样,那么我是不是需要
: 在循环体内free之(当然这就意味着也得再循环体内定义它)?
: 完整一点的例子在这里:
: int main ()
: {
: double data[10] = {1,2,3,4, 5,6,7,8,9,10};
: double * v = (double *) malloc ( 2 * sizeof(double));
: int i;

avatar
q*g
5
这个当然是一个更大的程序中的一个例子而已。。。。
是这样的:我要用MPI实现parallel computing,这样的话就需要从process 0 送出去
一些数据(double[n][m])。这些矩阵的大小只有在runtime 才知道,所以必须手动
分配内存。
我简化一下,就是这么一个东西:有一个大的data(一个长数组好了,反正matrix也是
数组),只有process 0 知道。然后它把这个数组分成一段一段的子数组,分别送给
process 1, proc 2, ....。
这样的话我就得在循环的时候(或者之前,whatever)定义一个v,用来存放那个
子数组。我的想法是:
data:
[ ..........................]
^ ^
[ ...]
v
v的长度事先用malloc给定,然后把v的起点定为 &data[k]即可。然后proc 0 就把
这个v送出去;
到了下一个循环,v的长度是一样的,但起点不同了。

space

【在 q*n 的大作中提到】
: memory leak happens because
: data -> memory block 1
: v -> memeroy block 2
: v = data
: what happens to memeory block2? it's address is lost and not accessible
: anymore, thus the memory leak.
: Anytime you malloc a piece of memory, you need to free it later, simple as
: that.

avatar
q*g
6
你别吓唬我啊,到底怎么搞才会内存泄漏?举个必须用到free()的例子吧 :-)
avatar
q*n
7
memory leak happens because
data -> memory block 1
v -> memeroy block 2
v = data
what happens to memeory block2? it's address is lost and not accessible
anymore, thus the memory leak.
Anytime you malloc a piece of memory, you need to free it later, simple as
that.

【在 q*****g 的大作中提到】
: 你别吓唬我啊,到底怎么搞才会内存泄漏?举个必须用到free()的例子吧 :-)
avatar
q*c
8
对....但是你这样可能还没退出系统内存就没了, 呵呵.

【在 q*****g 的大作中提到】
: 你别吓唬我啊,到底怎么搞才会内存泄漏?举个必须用到free()的例子吧 :-)
avatar
q*g
9
这个当然是一个更大的程序中的一个例子而已。。。。
是这样的:我要用MPI实现parallel computing,这样的话就需要从process 0 送出去
一些数据(double[n][m])。这些矩阵的大小只有在runtime 才知道,所以必须手动
分配内存。
我简化一下,就是这么一个东西:有一个大的data(一个长数组好了,反正matrix也是
数组),只有process 0 知道。然后它把这个数组分成一段一段的子数组,分别送给
process 1, proc 2, ....。
这样的话我就得在循环的时候(或者之前,whatever)定义一个v,用来存放那个
子数组。我的想法是:
data:
[ ..........................]
^ ^
[ ...]
v
v的长度事先用malloc给定,然后把v的起点定为 &data[k]即可。然后proc 0 就把
这个v送出去;
到了下一个循环,v的长度是一样的,但起点不同了。

space

【在 q*n 的大作中提到】
: memory leak happens because
: data -> memory block 1
: v -> memeroy block 2
: v = data
: what happens to memeory block2? it's address is lost and not accessible
: anymore, thus the memory leak.
: Anytime you malloc a piece of memory, you need to free it later, simple as
: that.

avatar
q*g
10
你别吓唬我啊,到底怎么搞才会内存泄漏?举个必须用到free()的例子吧 :-)
avatar
q*g
11
对对,完全没有必要,我自己也才刚看出来,呵呵。

【在 q*n 的大作中提到】
: memory leak happens because
: data -> memory block 1
: v -> memeroy block 2
: v = data
: what happens to memeory block2? it's address is lost and not accessible
: anymore, thus the memory leak.
: Anytime you malloc a piece of memory, you need to free it later, simple as
: that.

avatar
n*t
12
不用,你过一会malloc就fail了,你怎么分.

【在 q*****g 的大作中提到】
: 对对,完全没有必要,我自己也才刚看出来,呵呵。
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。