Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> free pointer on pointer 
:(
    Опции темы
Loki
Дата 20.7.2013, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Привет,
Давненько уже тут не бывал.
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list {
int h;
};

typedef struct list ITM;

int main(){
int i;
//ITM **items;
char **items;

        items = calloc(40,128); // warning: ‘items’ may be used uninitialized in this function

        //for(i=0;i<40;i++)
        //items[i] = calloc(1,128);

        //for (i=0;i<40;i++){
        //      free(*items+i); // total heap usage: 1 allocs, 39 frees, 5,120 bytes allocated
        //}                            // Searching for pointers to 1 not-freed blocks

        free(*items+0);

return 0;
}

вот пример того как пытаюсь чистить двойной указатель items.
Мне нужно выделять память, я делаю это 1 раз и 1 раз чищу.
Все что в ремарках это старые пробы, но не работает.
Вот что valgrind по этому поводу сказал.
Код

==6762== HEAP SUMMARY:
==6762==     in use at exit: 5,120 bytes in 1 blocks
==6762==   total heap usage: 1 allocs, 0 frees, 5,120 bytes allocated
==6762== 
==6762== Searching for pointers to 1 not-freed blocks

Раньше всегда пользовался массивами из обычных указателей, теперь возникла необходимость сделать другим способом.

Это сообщение отредактировал(а) Loki - 20.7.2013, 07:35
PM MAIL   Вверх
feodorv
Дата 20.7.2013, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Честно говоря, совсем не понятно, чего Вы хотите добиться с помощью "двойного указателя".
Цитата(Loki @  20.7.2013,  08:15 Найти цитируемый пост)
char **items;
        items = calloc(40,128); // warning: ‘items’ may be used uninitialized in this function
        free(*items+0);

Вот неважно, сколько звёзд у items. Если Вы делаете items = calloc/malloc, то обязаны сделать
Код

free( items );

а не 
Код

free( *items );

Хорошо ещё программа не рухнула, а ведь могла бы...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Loki
Дата 20.7.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



странно, но вроде работает, free принимает *, а я декларирую **.
void free(void *ptr);
valgrind сказал что теперь чистится.

а как почтистить аргумент структуры?
Код

struct flags {
int p;
char *name;
} FLAG[ROWS];

int main(){
int n;

FLAG[n].name = calloc(1,64);

}



Это сообщение отредактировал(а) Loki - 20.7.2013, 13:47
PM MAIL   Вверх
feodorv
Дата 20.7.2013, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Loki @  20.7.2013,  14:41 Найти цитируемый пост)
странно, но вроде работает, free принимает *, а я декларирую **.

А чем для free() отличается void ** от void *? Сколько бы звёзд не было у указателя, всё равно это указатель:
Код

char **ptr = (char **) malloc( 100 );
void *ptr2 = ptr;



Цитата(Loki @  20.7.2013,  14:41 Найти цитируемый пост)
valgrind сказал что теперь чистится.

После правки на free( items )?


Цитата(Loki @  20.7.2013,  14:41 Найти цитируемый пост)
а как почтистить аргумент структуры?

Чтобы Вы не делали в виде
Код

x = malloc( NNN );

то, если не меняли x в процессе выполнения кода, чистка происходит с тем же x:
Код

free( x );

Соответственно:
Код

free( FLAG[n].name );
FLAG[n].name = NULL; /* на всякий случай */



И всё-таки, вопрос повис в воздухе:
Цитата(feodorv @  20.7.2013,  12:44 Найти цитируемый пост)
Честно говоря, совсем не понятно, чего Вы хотите добиться с помощью "двойного указателя".

Если хотите динамический список структур, то это делается так:
Код

struct flags {
int p;
char name[64];
};

struct flags *FLAG = (struct flags *) malloc( ROWS * sizeof(struct flags) );
if( FLAGS == NULL ) /* error */;

/* инициализация массива структур */
int n;
for( n = 0; n < ROWS; n++)
{
  FLAGS[n].p = 1 << n;
  sprintf( FLAGS[n].name, "%d", n);
}

Если хотите статический список структур, то так:
Код

struct flags FLAGS[ROWS] = 
{
  { 0x0001, "один" },
  { 0x0002, "два" },
  ...
  { 0x8000, "последный" }
};


Зачем Вам "двойной указатель"?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Loki
Дата 21.7.2013, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Все то оно парвильно, второе(со указателем в стректуре) работает в маленьком примере.
А вот в большом нет.
Код

==5749== Invalid free() / delete / delete[] / realloc()
==5749==    at 0x4C2B35C: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==5749==    by 0x404B84: free_flag1 (in /usr/src/consol/client)

функция по чистке вот такая...
Код

void free_flag1(void){
int n;
        for(n=0;n<ROWS;n++){
        free(FLAG1[n].name);
        }

}



И еще вопрос по дебагу...
Что делать вот с таким.
Код

==5749==  Address 0x5d53530 is 0 bytes after a block of size 320 alloc'd
==5749==    at 0x4C2A4BB: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)


PM MAIL   Вверх
feodorv
Дата 21.7.2013, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Loki @  21.7.2013,  07:35 Найти цитируемый пост)
А вот в большом нет.

А что значит в "большом"?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Loki
Дата 26.7.2013, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



вот тут тему создал, что-то никто так и не подсказал...
http://forum.vingrad.ru/forum/topic-370575.html
там пример компилируемый.
PM MAIL   Вверх
bsa
Дата 30.7.2013, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Loki, просто твои вопросы к Unix отношения почти не имеют. Вот если бы у тебя были проблемы создания модуля ядра Linux, с вызовом ioctl или работы с curl, то тогда тебе туда. А вопросы по стандартной библиотеке сюда или в общие вопросы (но твои вопросы именно "начинающие").
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.