在将数据从一个指针传递到结构的指针数组元素时,我遇到了一些麻烦。
typedef struct {
float* data;
int size;
} vector;
//This function creates the vector
vector* doVector(int n, float* data){
vector * vec = (vector *) malloc(sizeof(vector));
vec->size = n;
vec->data = data;
return vec;
}
void delVector(vector* v){
free(v->data);
free(v);
}
void prVector(vector* v)
{
printf("[");
for(unsigned int i = 0; i<v->size; i++){
if(i!=v->size-1)
printf("%f,", v->data[i]);
else
printf("%f]\n", v->data[i]);
}
}
void fillVectors(float* data,int size){
vector * vectors = (vector*) malloc(size * sizeof(vector));
for(unsigned int i = 0; i < size; i++){
vectors[i] = *doVector(size,data);//This gives trouble
prVector(&vectors[i]);
}
//More stuff will be added here to work with the vectors.
for(unsigned int i = 0; i < size; i++)
delVector(&vectors[i]);//Memory leak here obv
free(vectors);// I also need to free the array
}
int main()
{
//Here recieving data from file and calling fillVectors
//Also allocating memory for data (which is send to fillvectors)
//Avoided to post because it's irrelevant and big
}
因此,主要思想是使用struct创建向量,从文件中读取Data和size并将其存储到名为data和int size的float数组中。然后我们调用函数fillVector,它将调用doVector函数并创建向量本身。
然后我想将每个向量的值分配给指针数组的位置(有3个malloc,数据和单个向量,它们是在doVector中创建的,以及在fillVectors中生成的向量数组)。
解决这个问题时出现问题,不断发生内存泄漏。 与向量数组的malloc和doVector的向量malloc有关。
ps:fillVector函数只调用一次
感谢。
答案 0 :(得分:2)
简单规则:在C中如果要在函数发送指针中处理smth。因此,如果想通过指针删除向量,则将指针传递给指针
void delVector(vector** v){
free((*v)->data);
free(*v);
*v = NULL;
}
函数已经返回指针,因此不需要使用星号。
vectors[i] = *doVector(size,data);
第二:你想要一组矢量?所以使用指向矢量的指针数组
vector **vectors = (vector**) malloc(size * sizeof(vector*));
for (unsigned int i = 0; i < size; i++){
vectors[i] = doVector(size, data);//This gives trouble
prVector(vectors[i]);//no need to use ampersand, it is already pointer
}
主要:你需要向量中的浮点数据的深层复制。现在所有向量都保持指向同一数组的指针,作为参数给出。除此之外,您删除此数据
free(v->data);
但是这个指针被复制了,但没有被拥有。
vector* doVector(size_t n, float* data){
size_t i;
vector * vec = (vector *) malloc(sizeof(vector));
vec->size = n;
vec->data = (float*)malloc(sizeof(float) * n);
for (i = 0; i < n; i++) {
vec->data[i] = data[i];
}
//or just
//memcpy(vec->data, data, n*sizeof(float));
return vec;
}
更多问题......
答案 1 :(得分:0)
您应该初始化所有创建的指针,而不是IMMEDIATELY分配给NULL或0或(void *)0。然后,对free的调用将清理所有已分配的数据。
每当分配实际数据类型时,请确保在分配之前将内部ptr设置为NULL。
vector* newVector;
newVector = (void*)0; //or 0, NULL
... //Code here
newVector = malloc(sizeof(vector));
newVector->data = (void*)0;
... //More code
if(!newVector){
free(newVector);
newVector = (void*)0;
}
如果必须进行动态内存分配,请以管理具有静态值的指针的格式进行。
正如Chris在下面提到的,删除空ptr已经由delete和free处理了,但我喜欢包含if语句来提醒自己在绝对必要时将指针设置为NULL。
再次感谢Chris:D
答案 2 :(得分:0)
我将专注于评论//This gives trouble
使用函数doVector
,您可以使用malloc
在内存中的某个位置创建一个矢量实例。然后,在通过执行*doVector(size, data)
取消引用结果时,您将获取创建的向量并尝试将其分配给vectors[i]
。这会将新创建的矢量的内存块复制到vectors[i]
位置,但不会将指针保留为doVector
的结果。
之后,您在for循环中释放vectors
逐个元素的内存,稍后您尝试在for循环后使用free(vectors)
再次释放相同的空间。但是,doVector
内分配的内存永远不会被释放,因为你没有指向创建向量的指针。
为了使其正确,我会坚持Ivan Ivanov的答案。我只是想指出为什么它不起作用。