#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;
}
Ошибка при освобождении памяти?
Использую visual c++ 2008 express. в функции get() создается объект char длиной substri_size и получается указатель на него. В функции main(), при помощи указателя p должна освобождаться память, занимаемая созданным объектом, но что-то не пашет, пишет ошибку "Normal block #118...", что мол пытаюсь залезть куда-то не туда в память=) Зато когда меняю substri_size на число - все работает... помогите разобраться!
Код:
Код:
int stringparser::get_int(){
char *p=get();
[COLOR="Red"]return atoi(p);
delete [] p;[/COLOR]
}
char *p=get();
[COLOR="Red"]return atoi(p);
delete [] p;[/COLOR]
}
Цитата: Нездешний
Оформляйте код тегами, блин!!!
Это вот так нынче в книгах пишут?
Код:
int stringparser::get_int(){
char *p=get();
[COLOR="Red"]return atoi(p);
delete [] p;[/COLOR]
}
char *p=get();
[COLOR="Red"]return atoi(p);
delete [] p;[/COLOR]
}
да, сам удивился, но именно после возврата стоит делете=) это не парит пока, думаю что его надо переместить туда же, где возникает ошибка...
Код поправил, все читабельно вроде=)
dusty, посмотри чему у тебя будет равна переменная j в “new_str[j]='\0';” и куда записывается 0 :)
Цитата: REFOT
dusty, посмотри чему у тебя будет равна переменная j в “new_str[j]='\0';” и куда записывается 0 :)
Зачем такие туманные ответы?:)
'\0' добавляется в конец строки new_str, которую заполнили в предыдущем цикле, дальше адрес строки new_str возвращается указателю *p в функции main(), дальше строка печатается и объект *p удаляется. Так я это понимаю
переменная j на 1 больше, чем в цикле над new_str[j]='\0';, т.е. в цикле увеличилась на 1, но поскольу условие цикла не прошло - осталось на 1 больше
Кому интересно, проблема была в том, что размер объекта был расчитан на строку без символа '\0', значит при создании объекта надо прибавить 1 к substri_size! Добавил - ошибки няма!!