Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CHAR и глюки в памяти

4.4K
29 сентября 2006 года
erzik
47 / / 08.04.2006
Как вы можете прокоментировать следующий момент
--------------------------------------------------------
Код:
AnsiString Split(AnsiString text, AnsiString symbol,AnsiString symbol_end , int symbol_num){
        AnsiString line = text;
        char *l = line.c_str();
        int num=0;
        int start=0; //тут с text всё еще нормально, как и должно быть
        for(start=0;(num<symbol_num && start<line.Length());++start){
                if(l[start]==symbol.c_str()[0]){
                        ++num;
                }
        }
        int end=start+1;
        num=0; //тут с text всё еще нормально
        if(symbol_end=="_end"){
                end = line.Length();
        }
        else{
                for(end=start+1;(num<1 && end<line.Length());++end){
                        if(l[end]==symbol_end.c_str()[0]){
                                ++num;
                        }
                }
        }//тут с text всё еще нормально
        AnsiString h = text;
        h = h.SubString(start+1,end-start-1);//тут с text всё еще нормально
        for(int g=0;g<line.Length();++g){
                l[g]=NULL;
        }    //а теперь text="" ПУСТО!!!
        return h;

}
--------------------------------------------------------

как объяснить затирание в памяти содержания переменной text ???
5.4K
29 сентября 2006 года
Svyatozar
221 / / 11.09.2006
этим и объясняется:

for(int g=0;g<line.Length();++g){
l[g]=NULL;
}
22K
30 сентября 2006 года
zaharovmag
1 / / 30.09.2006
Я не очень силен в Ц++ но на мой взгляд затирание вызвано следующим.
char *l = line.c_str();
Возвращает указатель на char;

l[g]=NULL;
Этим ты затираеш данные используемые line;

PS
Учите мат часть :)
309
30 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Как и во множестве других случаев, ошибка в этой строке: "char *l = line.c_str();" :D
Для обращения к символам строки используй "line ". char* же никогда не используй, за исключением тех случаев, когда без него не обойтись!!!

А если серьёзно, то....
Цитата:

AnsiString line = text;
//.... Код, в котором отсутствуют изменения line и text
for(int g=0;g<line.Length();++g){
l[g]=NULL;
} //а теперь text="" ПУСТО!!!


Дело в том, что AnsiString - это не просто контейнер для char* - указателя на массив строк. О том, как реализуется управление памятью в этом классе, читайте здесь - http://www.codenet.ru/progr/bcb/ansistring.php
То есть, объекты line и text содержат указатели на один и тот же массив строк. А его как раз и обнуляют :eek:

1
30 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=erzik]Как вы можете прокоментировать следующий момент
--------------------------------------------------------
[/QUOTE]
При размещении сообщений в данной ветке форума использование тега форматирования [ code ][ code ] является обязательным.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог