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

Ваш аккаунт

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

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

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

Ошибка при освобождении памяти?

34K
30 апреля 2009 года
dusty
11 / / 18.03.2008
Переписал пример из книги, и получается ошибка(Normal Block #118...)
Использую visual c++ 2008 express. в функции get() создается объект char длиной substri_size и получается указатель на него. В функции main(), при помощи указателя p должна освобождаться память, занимаемая созданным объектом, но что-то не пашет, пишет ошибку "Normal block #118...", что мол пытаюсь залезть куда-то не туда в память=) Зато когда меняю substri_size на число - все работает... помогите разобраться!

Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

class stringparser{
private:
    int pos;
    char *input_str;
    char *delimiters;
public:
    stringparser(char *inp, char *delim)
        {input_str=inp; delimiters=delim; pos=0;}
    stringparser(char *inp)
        {input_str=inp; delimiters=",";pos=0;}
    char *get();
    int get_int();
    int more(){return input_str[pos]!='\0';}
    void reset(){pos=0;}
};

int main(){
    char input_str[100];
    char *p;
    cout << "Enter input line: ";
    cin.getline(input_str, 99);
    stringparser parser(input_str, "/,");
    while(parser.more()){
        p=parser.get();
        cout << p << endl;
        [COLOR="Red"]delete []p;[/COLOR]
    }
    return 0;
}
char *stringparser::get(){
    int j=0;
    char *new_str;
       
    while(strchr(delimiters, input_str[pos])&& input_str[pos]!='\0'){
        pos++;
    }
    int substri_size;
    substri_size = strcspn(input_str + pos, delimiters);
    [COLOR="Blue"]new_str = new char[substri_size];[/COLOR]
   
    while(input_str[pos]!= '\0' && ! strchr(delimiters, input_str[pos])){
        new_str[j++]=input_str[pos++];
    }
    new_str[j]='\0';

    return new_str;
}
int stringparser::get_int(){
    char *p=get();
    return atoi(p);
    delete [] p;
}
535
30 апреля 2009 года
Нездешний
537 / / 17.01.2008
Оформляйте код тегами, блин!!!
 
Код:
int stringparser::get_int(){
     char *p=get();
     [COLOR="Red"]return atoi(p);
     delete [] p;[/COLOR]
}
Это вот так нынче в книгах пишут?
34K
30 апреля 2009 года
dusty
11 / / 18.03.2008
Цитата: Нездешний
Оформляйте код тегами, блин!!!
 
Код:
int stringparser::get_int(){
     char *p=get();
     [COLOR="Red"]return atoi(p);
     delete [] p;[/COLOR]
}
Это вот так нынче в книгах пишут?



да, сам удивился, но именно после возврата стоит делете=) это не парит пока, думаю что его надо переместить туда же, где возникает ошибка...
Код поправил, все читабельно вроде=)

2.2K
30 апреля 2009 года
REFOT
181 / / 08.04.2005
dusty, посмотри чему у тебя будет равна переменная j в “new_str[j]='\0';” и куда записывается 0 :)
34K
01 мая 2009 года
dusty
11 / / 18.03.2008
Цитата: REFOT
dusty, посмотри чему у тебя будет равна переменная j в “new_str[j]='\0';” и куда записывается 0 :)


Зачем такие туманные ответы?:)
'\0' добавляется в конец строки new_str, которую заполнили в предыдущем цикле, дальше адрес строки new_str возвращается указателю *p в функции main(), дальше строка печатается и объект *p удаляется. Так я это понимаю
переменная j на 1 больше, чем в цикле над new_str[j]='\0';, т.е. в цикле увеличилась на 1, но поскольу условие цикла не прошло - осталось на 1 больше

34K
01 мая 2009 года
dusty
11 / / 18.03.2008
REFOT, спасибо помог=)
Кому интересно, проблема была в том, что размер объекта был расчитан на строку без символа '\0', значит при создании объекта надо прибавить 1 к substri_size! Добавил - ошибки няма!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог