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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 14:22   #1
Dlav
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 3
Вопрос Проблема с освобождение памяти

Доброне время суток. Проблема с выполнением delete [] после конвертации, хотя если переменная не конвертировалась то проблема не возникает.
Код:
void SetFilesListData(CString FileName)
{
        int i = 0;
	TCHAR *line = new TCHAR[256];
	line = (LPTSTR)(LPCTSTR) FilesName;
	TCHAR *line_test = new TCHAR[256];
        line_test[i] = 't';
	while(line[i] != 0)
	{
		...
	}
        delete []line_test;// OK        
        delete []line;// проблема 
}
Аналогичное происходит если изменить способ преобразования
Код:
void SetFilesListData(CString FileName)
{
        int i = 0;
	char *line = new char[256];
        USES_CONVERSION
	line = T2A(FilesName);
	while(line[i] != 0)
	{
		...
	}
        delete []line;// проблема 
}
VS2010 выкидывает сообщенние:
Windows has triggered a breakpoint in Test.exe.
This may be due to a corruption of the heap, which indicates a bug in Test.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while Test.exe has focus.
The output window may have more diagnostic information.

Буду рад слышать мнения как решить проблему !!!
Dlav вне форума Ответить с цитированием
Старый 25.08.2013, 15:46   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
char *line = new char[256];  //<--- указатель хранит адрес выделенного блока
...
line = T2A(FilesName); //<--- этот адрес перезаписан новой информацией
                              //<--- утечка памяти
...
   
delete []line;// <--- адрес изначального блока уже утерян
       //<--- попытка уничтожить данные по какому то левому адресу,
       //который не соответствует адресу изначального блока
_Bers вне форума Ответить с цитированием
Старый 25.08.2013, 16:30   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

TCHAR *line = new TCHAR[256];
line = (LPTSTR)(LPCTSTR) FilesName;

Вы выделяете память а потом теряете указатель на нее.
waleri вне форума Ответить с цитированием
Старый 25.08.2013, 18:19   #4
Dlav
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 3
По умолчанию

Благодарю за разъяснения !!!
Не обратил внимание на то, что адрес переменной изменяется после выполнение операции .
Подскажите пожалуйста, как в таком случае бороться с утечкой или может есть возможность добраться до нужного адреса и освободить память?
Dlav вне форума Ответить с цитированием
Старый 25.08.2013, 19:25   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dlav Посмотреть сообщение
Подскажите пожалуйста, как в таком случае бороться с утечкой или может есть возможность добраться до нужного адреса и освободить память?
Код:
void SetFilesListData(CString FileName)
{
        int i = 0;
        USES_CONVERSION
        char *line = T2A(FilesName);
	while(line[i] != 0)
	{
		...
	}
}
Проблема решается очень просто: не нужно выделять память для неиспользуемого объекта.

Соотвествено - не нужно будет ничего удалять.
_Bers вне форума Ответить с цитированием
Старый 25.08.2013, 21:12   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Проблема решается очень просто: не нужно выделять память для неиспользуемого объекта.

Соответственно - не нужно будет ничего удалять.
Абсолютно справедливо...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 26.08.2013, 01:40   #7
Dlav
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 3
По умолчанию

В принципе все как по учебнику: нет new, то и delete не нужен.
Проблема решена и тему можно закрывать.

Всем огромное спасибо за помощь!!!
Dlav вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36