Очистка памяти с++

Компьютеры программирование программы windows с++

searchaddword(char * s){

int l1=strlen(s);

char * str=new char[l1+1];
memset(str,0,sizeof(str));
strcpy(str,s);

//....
//....
delete str;
}


Собственно вопрос, все работает нормально пока слово состоит больше чем из одной буквы. Как только s - одна буква, delete str вылетает с ошибкой. Возможно я чего то не понимаю, но ведь переменную динамическую которая состоит из 1 символа можно очистить? Тогда откуда берется ошибка?

Примечание:
delete [] str;

поменял, ничего не изменилось. Как только s - одна буква, вылетает.

Примечание:
Вот такая вот гадость выскакивает.

http://s005.radikal.ru/i212/1305/6c/86c3d97dcdad.jpg

Примечание:
Проблема в memset

char s1[] = "o";
int l1=strlen(s1);
char* str=new char[l1+1];

//...................
memset(str,0,l1+1);//работает
//...
memset(str,0,sizeof(str));//не работает
//...
memset(str,0,l1+2);//не работает (та же ошибка)
//..................

strcpy(str,s1);
delete [] str;

Собственно вопрос теперь состоит в том почему memset отрабатывает неверно при размере массива меньше трех?

Примечание:
Все разобрался!

sizeof(char)==1
sizeof(char *)==4

memset заполняет память на N количество элементов. Т.е в случае sizeof(char *) что эквивалентно sizeof(str) мы заполняем первые 4 элемента. Если же у меня массив меньше трех (меньше четырех с последним 0 включительно), то портится левая память. Мой компилятор на это отреагировал. А у некоторых пропустил мимо.

Правильным вариантом является memset(str,0,l1+1); в моем случае и memset(str,0,size*sizeof(type)); где type - тип массива (мне повезло что тип char == 1) а size - длинна массива.
Ответы:
Сдаётся мне что у тебя new неверное. new char против char * str - это же указатель. Хотя в C99 так допустимо делать через = сразу.
delete [] str
Специально прогнал вот такой код:
char s[] = "o";
int l1=strlen(s);
char* str=new char[l1+1];
memset(str,0,sizeof(str));
strcpy(str,s);
delete [] str;
Все нормально. Возможно, вы где-то в вырезанном куске что-то с указателем не то делаете.


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.