我正在学习如何使用 Tensorflow C api,但在释放内存时遇到了问题。根据 Valgrind,我在 1 个块中丢失了 112 个字节。我不知道我错过了什么。我相信这是一个类型转换问题,但我可能是错的。
谁能告诉我我未能释放什么以及我应该如何释放它?另外,如果有不必要的类型转换,请告诉我
typedef struct train *Model;
struct train
{
const char *modelDirectory;
const char *tags;
TF_Graph *graph;
TF_Status *status;
TF_SessionOptions *sessionOptions;
TF_Buffer *runOptions;
TF_Session *session;
TF_Output *input;
TF_Output *output;
int numberOfInputs;
int numberOfOutputs;
TF_Tensor **inputValues;
TF_Tensor **outputValues;
float *data;
int dataLength;
};
Model CreateModel(const char *modelDirectory, const char *tags, char *inputLayerName, char *outputLayerName, int dataLength)
{
Model model = malloc(sizeof(*model));
int numberOfTags = 1;
model->numberOfInputs = 1;
model->numberOfOutputs = 1;
model->modelDirectory = modelDirectory;
model->tags = tags;
model->graph = TF_NewGraph();
model->status = TF_NewStatus();
model->sessionOptions = TF_NewSessionOptions();
model->runOptions = NULL;
model->session = TF_LoadSessionFromSavedModel(model->sessionOptions, model->runOptions, model->modelDirectory, &model->tags, numberOfTags, model->graph, NULL, model->status);
assert(TF_GetCode(model->status) == TF_OK);
model->input = (TF_Output*)malloc(sizeof(TF_Output) * model->numberOfInputs);
model->output = (TF_Output*)malloc(sizeof(TF_Output) * model->numberOfOutputs);
TF_Output inputLayer = {TF_GraphOperationByName(model->graph, inputLayerName), 0};
TF_Output outputLayer = {TF_GraphOperationByName(model->graph, outputLayerName), 0};
assert(outputLayer.oper != NULL);
assert(inputLayer.oper != NULL);
model->input[0] = inputLayer;
model->output[0] = outputLayer;
model->inputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*)*model->numberOfInputs);
model->outputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*)*model->numberOfOutputs);
model->data = calloc(dataLength, sizeof(float));
model->dataLength = dataLength;
return model;
}
//Destroy Model
void DestroyModel(Model model)
{
TF_DeleteSessionOptions(model->sessionOptions);
TF_DeleteSession(model->session, model->status);
TF_DeleteStatus(model->status);
TF_DeleteGraph(model->graph);
TF_DeleteBuffer(model->runOptions);
free(model->input);
free(model->output);
free(model->inputValues);
free(model->outputValues);
free(model->data);
free(model);
}