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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2010, 16:33   #1
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию проблема с удалением массива в vc++

такая проблема.vc++2008.

LPWSTR str = new wchar_t[GetNumDigits(n)+1];
//тут работаю с этой структурой
delete[]str;


вот при удалении выдает ошибку в куче.В borland с такими проблемами не сталкивался.если сделать

str = NULL;
delete[] str;

то срабатывает,но при этом можно в debug увидить
+ str 0x00000000 <Неправильный указатель> wchar_t *

Объясните пожалуйста как решить проблему.
scripto вне форума Ответить с цитированием
Старый 12.12.2010, 18:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
то срабатывает,но при этом можно в debug увидить
Вы сначала присвоили указателю НИЧТО, а потом пытаетесь удалить... где ваша логика?
p51x вне форума Ответить с цитированием
Старый 12.12.2010, 19:05   #3
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

мне кажется вы плохо прочли.Это не логично признаю,но это единственное,что срабатывает-указано новичко в каком-то форуме MSDN.
Логичнее было бы просто воспользоваться delete[]str -но это не срабатывает.Так как удалить динамически выделенный массив?В борланде
код похожий на этот:

LPWSTR str = new wchar_t[GetNumDigits(n)+1];
...//остальной код
delete[]str;

срабатывает без проблем,но в vc++ 2008выдает ошибку.И любые модификации,например
1)LPWSTR str = NULL;
str =new wchar_t[GetNumDigits(n)+1];
...
delete[]str;
2)LPWSTR str = new wchar_t[GetNumDigits(n)+1];
delete[]str;str=NULL;

выдают ту же ошибку с кучей(heap)
scripto вне форума Ответить с цитированием
Старый 12.12.2010, 19:24   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Покажите пожалуйста код GetNumDigits.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 12.12.2010, 19:26   #5
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

Код:
int GetNumDigits(int num)
{
        int RetVal = 0;
        while(0 < num)
        {
                num /= 10;
                RetVal++;
        }
        return RetVal;
}
пробова и произвольно выделять память-не помогло

извиняюсь за опечатку."пробовал".
LPWSTR str = new wchar_t[255];
...delete[]str;

выдало ту же ошибку.Про нее многое написано в msdn:использование new/delete и ошибка возникающая с кучей при этом,но конкретного ответа нет. Скажу,что опыт в прграммировании у меня 2года,но пользовался Борландом и освобождение памяти не вызывало таких проблем.
Буду блогадарен за любую помощь.

Последний раз редактировалось Stilet; 12.12.2010 в 19:46.
scripto вне форума Ответить с цитированием
Старый 13.12.2010, 11:38   #6
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

Здравствуйте,Syuf.
Вы не знайте как исправить возникшую с кучей проблему?
scripto вне форума Ответить с цитированием
Старый 13.12.2010, 17:40   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

А что вы делаете во время
"//тут работаю с этой структурой"
Может там уже освобождается память?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 13.12.2010, 17:49   #8
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

Спасибо,что откликнулись.
Я не смог найти такого места в своей процедуре. Если память и очищается до явного вызова delete, то не могли бы вы мне указать в каком месте?вот код функции:
void draw_top(int &n, POINT point[], POINT P, HDC hdc)
{
int ht, wt;


point[n].x = P.x;
point[n].y = P.y;
Ellipse(hdc, point[n].x - 20, point[n].y - 20, point[n].x + 20, point[n].y + 20);

SIZE t_size;

LPWSTR str = new wchar_t[GetNumDigits(n)+1];

//конвертируем в строку число n
_itow_s(n,str,lstrlen(str),10);

GetTextExtentPoint32(hdc, str,lstrlen(str),&t_size);
ht = t_size.cy;
wt = t_size.cx;
TextOut(hdc, point[n].x - wt/2, point[n].y - ht/2, str, lstrlen(str));

// str = NULL;
delete[]str;


n++;
scripto вне форума Ответить с цитированием
Старый 13.12.2010, 17:51   #9
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

извиняюсь за плохо скопированый код(не скопировал '}')

void draw_top(int &n, POINT point[], POINT P, HDC hdc)
{
int ht, wt;


point[n].x = P.x;
point[n].y = P.y;
Ellipse(hdc, point[n].x - 20, point[n].y - 20, point[n].x + 20, point[n].y + 20);

SIZE t_size;

LPWSTR str = new wchar_t[GetNumDigits(n)+1];

//конвертируем в строку число n
_itow_s(n,str,lstrlen(str),10);

GetTextExtentPoint32(hdc, str,lstrlen(str),&t_size);
ht = t_size.cy;
wt = t_size.cx;
TextOut(hdc, point[n].x - wt/2, point[n].y - ht/2, str, lstrlen(str));

// str = NULL;
delete[]str;


n++;
}
scripto вне форума Ответить с цитированием
Старый 13.12.2010, 21:48   #10
scripto
Пользователь
 
Регистрация: 21.10.2010
Сообщений: 15
По умолчанию

Думаю,что ошибка кроется в GetNumDigits.
Всем спасибо,навели на мысль.Далее справлюсь.
scripto вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с удалением файла katttes Общие вопросы Delphi 3 30.04.2010 13:17
помогите, пожалуйста, с удалением массива char в с++! Mira-girl Общие вопросы C/C++ 2 09.11.2009 00:50
Проблема с удалением файлов. Dj_smart Общие вопросы Delphi 4 22.03.2008 12:32
Ошибка с удалением pr1de БД в Delphi 1 08.05.2007 03:44