c проблема утечки памяти - PullRequest
0 голосов
/ 27 ноября 2010

В моем проекте есть функция c, которая создает структуру и возвращает указатель.

typedef struct object 
{
 float var1; 
 float var2; 
} 
Object; 

Object *createObject(float newVar1, float newVar2) 
{
 Object *object; //create new structure 
 object = (Object*)malloc(sizeof(Object)); //malloc size for struct object
 if(object != NULL) //is memory is malloc'd
 {
  object->var1 = newVar1; //set the data for var1
  object->var2 = newVar2; //set the data for var2
  return object; //return the pointer to the struct
 }
 return NULL; //if malloc fails, return NULL
}

теперь структура используется, и через некоторое время я хочу удалить эту структуру, я сделал эту функцию:

void deleteMarnix(Object *objectPointer)
{
 free(objectPointer); //free the memory the pointer is pointing to
 objectPointer = NULL; //stop it from becomming a dangling pointer
}

этот последний фрагмент кода показывает, как я делаю объект,используйте это и попытайтесь удалить это, однако, кажется, что это не полностью освобождает память.что я делаю не так?

Object *object = createObject(21.0f, 1.87f);
//do things here with object.
deleteMarnix(object);

Ответы [ 2 ]

3 голосов
/ 27 ноября 2010

Из опубликованных вами фрагментов утечки нет.

Я думаю, что с:

кажется, что он не освобождает полностью память

Вы имеете в виду, что object по-прежнему содержит старое значение.


В deleteMarnix, когда вы устанавливаете objectPointer в NULL, вы только устанавливаете значение указателя в этомобласть действия функции.

Он не устанавливает значение фактического указателя object во внешней функции.

Для этого вы можете:

  1. установите его на NULL во внешней функции

    Object *object = createObject(21.0f, 1.87f);
    deleteMarnix( object );
    object = NULL;
    
  2. передайте указатель на указатель на вашу deleteMarnix функцию:

    void deleteMarnix(Object **objectPointer)
    {
      free(*objectPointer); //free the memory the pointer is pointing to
      *objectPointer = NULL; //stop it from becomming a dangling pointer
    }
    ...
    Object *object = createObject(21.0f, 1.87f);
    deleteMarnix( &object );
    
2 голосов
/ 28 ноября 2010

То, что делает free (), не освобождает память, полностью удерживаемую указателем, но фактически делает ее доступной для последующего использования, если мы вызываем malloc после вызова free ().

Доказательством этого является то, что вы сможете получить доступ к ячейке памяти после вызова free и до установки указателя в NULL (при условии, что вы еще не вызывали malloc ()). Конечно, значения будут сброшены на некоторые значения по умолчанию. (На некоторых компиляторах я обнаружил, что int был установлен в 0).

Хотя утечки памяти нет, это может ответить на ваш вопрос.

Дайте нам знать:)

...