name
никогда не освобождается, поэтому происходит утечка.
Сложные структуры, выделенные в куче, подобные этим, часто лучше всего обрабатываются при переходе на C ++ или (если это невозможно) путем обертывания памятиуправление в пользовательских функциях создания / уничтожения / манипуляции:
Person *CreatePerson(void) {
/* you can use calloc() here, of course */
Person *result = malloc(sizeof(Person));
if (result) {
memset(result, 0, sizeof(Person));
}
return result;
}
void DestroyPerson(Person *p) {
if (p) {
free(p->name);
free(p);
}
}
void SetPersonName(Person *p, const char *name) {
if (p) {
if (p->name) {
free(p->name);
p->name = NULL;
}
if (name) {
size_t len = strlen(name);
p->name = malloc(len + 1);
if (p->name) {
strncpy(p->name, name, len);
p->name[len] = 0;
}
}
}
}
const char *GetPersonName(const Person *p) {
if (p)
return p->name;
return NULL;
}
Однако, как вы можете видеть по количеству используемого кода, C ++ часто является лучшим выбором:
class Person {
private: std::string name;
public: const std::string& getName(void) const {
return this->name;
}
public: void setName(const std::string& newName) {
this->name = newName;
}
};
Гораздо короче, чище и яснее!