Утечка памяти, язык си
Преподаватель сказал, что происходит утечка памяти в функции, которая начинается на 80 строке. Проблема в пустом векторе, но как исправить плохо понимаю
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int def_i = 0;
float def_f = 0;
typedef struct vector {
void* buffer;
int count;
int elem_size;
int flag; // 0 - int, 1 - float
}vector;
void set_elem_f(vector* a, int index, void* value) {
void* p = (char*)a->buffer + a->elem_size * index;
memcpy(p, value, a->elem_size); // memcpy() is used to copy a block of memory from a location to another.
}
void set_elem_i(vector* a, int index, void* value) {
void* p = (char*)a->buffer + a->elem_size * index;
memcpy(p, value, a->elem_size);
}
vector* create_int(int count, int elem_size) {
vector* vec = (vector*)malloc(sizeof(vector));
vec->count = count;
vec->elem_size = elem_size;
vec->buffer = malloc(count * elem_size);
for (int i = 0; i < count; i++)
set_elem_i(vec, i, &def_i);
vec->flag = 0;
return vec;
}
vector* create_float(int count, int elem_size) {
vector* vec = (vector*)malloc(sizeof(vector));
vec->count = count;
vec->elem_size = elem_size;
vec->buffer = malloc(count * elem_size);
for (int i = 0; i < count; i++)
set_elem_f(vec, i, &def_f);
vec->flag = 1;
return vec;
}
int get_elem_i(vector* a, int index) {
int* value = (int*)malloc(a->elem_size);
void* p = (char*)a->buffer + a->elem_size * index;
memcpy(value, p, a->elem_size);
int res = *value;
free(value);
return res;
}
float get_elem_f(vector* a, int index) {
float* value = (float*)malloc(a->elem_size);
void* p = (char*)a->buffer + a->elem_size * index;
memcpy(value, p, a->elem_size);
float res = *value;
free(value);
return res;
}
vector* summ_vec(vector* vec1, vector* vec2) {
setlocale(LC_ALL, "Rus");
if (vec1->count != vec2->count) {
vector* vec3 = create_float(0, 4);
printf("Размеры векторов не совпадают.");
}
else {
void* buffer1 = vec1->buffer;
void* buffer2 = vec2->buffer;
int count = vec1->count;
vector* vec3 = (vector*)malloc(sizeof(vector));
vec3->elem_size = 4;
vec3->count = count;
if ((vec1->flag == 0) && (vec2->flag == 0)) {
void* buffer3 = (int*)malloc(count * sizeof(float));
vec3->buffer = buffer3;
int a, b, c;
for (int i = 0; i < count; i++) {
a = get_elem_i(vec1, i);
b = get_elem_i(vec2, i);
c = a + b;
set_elem_i(vec3, i, &c);
}
vec3->flag = 0;
}
if ((vec1->flag == 0) && (vec2->flag == 1)) {
void* buffer3 = (float*)malloc(count * sizeof(float));
vec3->buffer = buffer3;
int a;
float c, b;
for (int i = 0; i < count; i++) {
a = get_elem_i(vec1, i);
b = get_elem_f(vec2, i);
c = (float)a + b;
set_elem_f(vec3, i, &c);
}
vec3->flag = 1;
}
if ((vec1->flag == 1) && (vec2->flag == 0)) {
void* buffer3 = (float*)malloc(count * sizeof(float));
vec3->buffer = buffer3;
int b;
float a, c;
for (int i = 0; i < count; i++) {
a = get_elem_f(vec1, i);
b = get_elem_i(vec2, i);
c = a + (float)b;
set_elem_f(vec3, i, &c);
}
vec3->flag = 1;
}
if ((vec1->flag == 1) && (vec2->flag == 1)) {
void* buffer3 = (float*)malloc(count * sizeof(float));
vec3->buffer = buffer3;
float a, b;
float c;
for (int i = 0; i < count; i++) {
a = get_elem_f(vec1, i);
b = get_elem_f(vec2, i);
c = a + b;
set_elem_f(vec3, i, &c);
}
vec3->flag = 1;
}
return vec3;
}
}
введите сюда код
Ответы (1 шт):
строка 80:
Переменную результата объявите одну, внутри условий не надо и возвращать нужно результат всегда. Утечка памяти была при ошибке разных размеров. Создаёте новый вектор и его не возвращаете.
vector* summ_vec(vector* vec1, vector* vec2) {
vector * vec3 = NULL ;
...
return vec3 ; }
строка 82:
if (vec1->count != vec2->count) {
//vector* vec3 = create_float(0, 4);
При ошибке вы возвращаете вектор ненужный. Можно просто вернуть NULL с инструкций, что функция может это вернуть.
строка 96:
void* buffer3 = (int*)malloc(count * sizeof(float));
строка 105:
vec3->flag = 0;
Тип вектора int, а память выделяете под float. Исправить нужно на sizeof(int).
Деструктор вы не написали. Примерно такой:
void vector_destr(vector * const v) {
if(v)
free(v->buffer); }
void vector_delete(vector * const v) {
vector_destr(v);
free(v); }
Каждый раз, при освобождении вектора, нужно его вызывать :
vector * const tmp = summ_vec ( vec1 , vec2 ) ;
...
vector_delete(tmp);