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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2009, 15:31   #1
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию Динамическая строка

Здравствуйте. В теле цикла создается динамическая строка
Код:
char *a = new char [100];
Затем ей присваивается, например, "abc". Потом удаляется
Код:
delete [] a;
Объясните, пожалуйста, почему в этой строке после создания остается предыдущее значение, разве она не должна быть пустой?
Сергей089 вне форума Ответить с цитированием
Старый 22.03.2009, 16:34   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Имеется ввиду, что после delete указатель a продолжает указывать на строку abc?
delete физически ничего не удаляет, просто область памяти помечается как свободная и при необходимости будет использована для следующих вызовов new, после чего старое значение "затрется" новыми данными.
Или после new в a записан мусор?
Лучше после выделения памяти инициализировать данные. Для объектов классов вызывается конструктор, а вот для "обычных" типов никакой очистки и инициализации не происходит.
Если написать int a, то в а будет записан ноль. Если же int *a = new int; то будет мусор. В любом случае все переменные лучше инициализировать перед использованием.

Последний раз редактировалось pu4koff; 22.03.2009 в 16:39.
pu4koff вне форума Ответить с цитированием
Старый 22.03.2009, 16:43   #3
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Нет, после delete а не указывает на abc. Но после new старое значение остается, и если присвоить a строку "d", то будет не "d", а "dbc".
Сергей089 вне форума Ответить с цитированием
Старый 22.03.2009, 17:17   #4
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

полный код приводи. а то после твоего "присвоить" кажется, что ты именно присваиваешь, а не копируешь функцией strcpy
vvviperrr вне форума Ответить с цитированием
Старый 22.03.2009, 17:28   #5
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Вот код:
Код:
int main(int argc, char* argv[])
{
        char text[100];
        printf (Rus("Введите строку\n"));
        gets (text);
        char b[100] = "";
        for (int i = 0; i<strlen(text); i++)
                if (text[i]==' ') {
                                    char *a = new char [100];
                                    strncpy (a,text,i);
                                    for (int k = 1; k<=i+1; k++)
                                        for (int j = 0; j<strlen(text); j++)
                                                text[j] = text [j+1];
                                    i = -1;
                                    strcat (a," ");
                                    strcat (a,b);
                                    strcpy (b,a);
                                    delete [] a;
                                  }
        strcat (text," ");
        strcat (text,b);
        printf (Rus("\nРезультат:\n"));
        printf ("%s\n\n", text);
        system ("pause");
        return 0;
}
Здесь нужно слова вывести в обратном порядке. Я сделал а динамической, так как не знаю функцию аналогичную Delete в pascal.
Сергей089 вне форума Ответить с цитированием
Старый 23.03.2009, 00:40   #6
Mega
Пользователь
 
Регистрация: 14.03.2009
Сообщений: 41
По умолчанию

потому что указатель указывает на 1ый байт выделенной памяти
Mega вне форума Ответить с цитированием
Старый 23.03.2009, 04:29   #7
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если написать int a, то в а будет записан ноль.
Вот здесь я не согласен, к примеру такой код
Код:
#include <iostream>
using namespace std;

int y;//! global здесь 0

int main()
{
	int a;//! в а мусор

	static int x;//! static здесь  0

	cout<<a<<endl;//вылетит! ошибка

	cout<<y<<endl;//норм
	cout<<x<<endl;//норм

	return 0;
}
Цитата:
Сообщение от pu4koff Посмотреть сообщение
В любом случае все переменные лучше инициализировать перед использованием.
за это да, но и потом после удаления лучше нулём забить ( int *p = new int; ... delete p; p = 0 )
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 23.03.2009, 08:12   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Вот здесь я не согласен, к примеру такой код
Согласен. Для локальных переменных это не работает. Просто всегда инициализирую перед использованием, вот и подзабыл эти нюансы
Цитата:
Сообщение от ISergeyN Посмотреть сообщение
за это да, но и потом после удаления лучше нулём забить ( int *p = new int; ... delete p; p = 0 )
Ну это только если в дальнейшем планируется использовать эту переменную. И лучше не 0, а макрос NULL. Суть одна, но всеже NULL нагляднее. Если не написать p = NULL, то просто потом никак не определишь: указатель у нас "рабочий" или нет.
pu4koff вне форума Ответить с цитированием
Старый 23.03.2009, 16:18   #9
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Цитата:
Сообщение от Mega Посмотреть сообщение
потому что указатель указывает на 1ый байт выделенной памяти
Но ведь он удаляется, потом снова создается. Почему он указывает на туже самую строку?
Сергей089 вне форума Ответить с цитированием
Старый 23.03.2009, 16:36   #10
Mega
Пользователь
 
Регистрация: 14.03.2009
Сообщений: 41
По умолчанию

Код:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char *p=new char(100);
strcpy(p,"abc");
cout << p<<endl;// vivodit abc
delete [] p;
p=NULL;
cout << p<<endl;//nichego ne vivodit
return 0;
}

псле операции delete нужно присвоить указателю значение NULL
Mega вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическая строка в консоле win32 AlexeyLed Общие вопросы C/C++ 4 10.03.2009 12:39
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32
Динамическая переменная kezman Общие вопросы C/C++ 1 29.07.2008 13:49
Класс Динамическая строка по Си Zolotce Помощь студентам 1 26.04.2008 18:58
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05