Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2009, 14:19   #1
BeNN
 
Регистрация: 05.07.2009
Сообщений: 6
По умолчанию malloc free Ошибка.

Добрый день. Проблема заключается следующем: в функцию передается указатель на динамический массив, функция создает новый динамический массив(с большей размерностью) и копирует содержимое старого. Дальше по идее надо освободить память, выделенную под старый массив - вот тут и возникает ошибка. Что я не так делаю? Подскажите пожалуйста. Пишу на си, visual 6.0

Код:
int* yvel(int *a, int kolvo, int kol) 
{
	int r;
	int *w;
	w = (int *) malloc(sizeof(int) kolvo+kol);		
	for (r = 0;r < kolvo;r++)						
		w[r] = a[r];
		free(a);		//<<<<<			
	for (r = kolvo; r < kolvo+kol;r++)				 
		w[r] = 0;									 
	return &w[0];
}

Последний раз редактировалось MaTBeu; 08.07.2009 в 15:23.
BeNN вне форума Ответить с цитированием
Старый 05.07.2009, 15:33   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Что за ошибка то? И приведите часть когда, где создается переменная a и где вызывается функция
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 05.07.2009, 15:45   #3
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
free(a);
Вообще тут ничего не нужно удалять.

Вместо этого:
Код:
return &w[0]
можно написать так:

Код:
return w;
И получаем вот это:

Код:
int* yvel(int *a, int kolvo, int kol)  
{ 
    int r; 
    int *w; 
    w = (int *) malloc(sizeof(int) kolvo+kol);         
    for (r = 0;r < kolvo;r++)                         
        w[r] = a[r];          
    for (r = kolvo; r < kolvo+kol;r++)                  
        w[r] = 0;                                      
    return w; 
}
profi вне форума Ответить с цитированием
Старый 05.07.2009, 15:53   #4
BeNN
 
Регистрация: 05.07.2009
Сообщений: 6
По умолчанию

Да, а как же быть с массивом а? он больше не нужен и память нужно освобождать, не так ли?
BeNN вне форума Ответить с цитированием
Старый 05.07.2009, 16:02   #5
BeNN
 
Регистрация: 05.07.2009
Сообщений: 6
По умолчанию

Код:
#include <stdio.h>
#include <malloc.h>


int* vid(int kolvo)		
{
	int *z;
	z = (int *) malloc(sizeof(int) kolvo);
	return &z[0];	
}

int* zap(int *a, int kolvo)		
{
	int b;
	for (b = 0;b < kolvo;b++)
		a[b] = b+1;
	return &a[0];
}

int* yvel(int *a, int kolvo, int kol) 
{
    int r;
    int *w;
    w = (int *) malloc(sizeof(int) kolvo+kol);        
    for (r = 0;r < kolvo;r++)                        
        w[r] = a[r];
        free(a);        //<<<<<            
    for (r = kolvo; r < kolvo+kol;r++)                 
        w[r] = 0;                                     
    return &w[0];
}  

main() {
int kolvo=5;	 	
int kol=10;
int *a, *w;

a = vid(kolvo);		
zap (a, kolvo);
w = yvel(a,kolvo,kol);
}
Выдает Debug error!
BeNN вне форума Ответить с цитированием
Старый 05.07.2009, 16:14   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

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

Вообще-то это все так:

Код:
#include <vcl.h>
#include <stdio.h>

int* vid(int kolvo)
{
	int *z;
	z = new int[kolvo];
	return z;
}

int* zap(int *a, int kolvo)
{
	int b;
	for (b = 0;b < kolvo;b++)
		a[b] = b+1;
	return a;
}

int* yvel(int *a, int kolvo, int kol)
{
    int r;
    int *w;
    w = new int[kolvo+kol];
    for (r = 0;r < kolvo;r++)
        w[r] = a[r];

    for (r = kolvo; r < kolvo+kol;r++)
        w[r] = 0;
    return w;
}

int main()
{
int kolvo=5;
int kol=10;
int *a, *w;

a = vid(kolvo);
zap (a, kolvo);
w = yvel(a,kolvo,kol);

for (int i=0;i<kolvo;i++)
printf("w[%d]=%d\n",i,w[i]);

delete []a;
delete []w;

return 0;
}
Сравните этот код со своим.
profi вне форума Ответить с цитированием
Старый 05.07.2009, 16:28   #7
BeNN
 
Регистрация: 05.07.2009
Сообщений: 6
По умолчанию

А возможно все же написать через malloc и free и чтобы удаление происходило в функции yvel ?
BeNN вне форума Ответить с цитированием
Старый 05.07.2009, 16:33   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Возможно через malloc, но разницы не вижу. Просто через new короче и проще. Нельзя очистить память под указатель *a так как вы под него в функции yvel её не выделяли.

Последний раз редактировалось profi; 05.07.2009 в 16:37.
profi вне форума Ответить с цитированием
Старый 05.07.2009, 16:38   #9
BeNN
 
Регистрация: 05.07.2009
Сообщений: 6
По умолчанию

Ясно, а если через malloc - то просто заменить new на malloc? Получается нельзя в одной функции удалить память, выделенную в другой? только в main'е ?
BeNN вне форума Ответить с цитированием
Старый 05.07.2009, 16:47   #10
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Ясно, а если через malloc - то просто заменить new на malloc?
Вот такая конструкция функции new (под массив):

указатель = new int[размер_массива];

Цитата:
олучается нельзя в одной функции удалить память, выделенную в другой? только в main'е ?
Тут много "приколов". Долго объяснять, почитайте лучше книгу Стивена Прата, статью про передачу указателей функциям.
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка:*** glibc detected *** free(): invalid next size (fast): 0x0807dc70 *** ciaonataha Общие вопросы C/C++ 3 05.05.2009 16:58
Проблемы с выделением динамической памяти malloc (recalloc) slips Общие вопросы C/C++ 6 29.04.2009 19:27
DLL. Ошибка при Form1.Free Roof Общие вопросы Delphi 3 26.07.2008 01:21
Free Pascal(2.0.4) ошибка: Error while linking Акашаев Нурлан Паскаль, Turbo Pascal, PascalABC.NET 2 04.08.2007 10:10