Форум программистов, компьютерный форум CyberForum.ru

Точка останова - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Glide
0 / 0 / 0
Регистрация: 21.12.2012
Сообщений: 3
21.12.2012, 14:04     Точка останова #1
Здравствуйте все!
Не пойму в чём проблема.
Вот так всё работает:
C++
1
2
3
4
5
void main()
{
    char *c = new char [5];
    delete [] c;
}
Но когда начинаю заполнять массив:
C++
1
2
3
4
5
6
void main()
{
    char *c = new char [5];
    c = "1234";
    delete [] c;
}
Генерируется ошибка:
Код
ОС Windows инициировала точку останова в Тест.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в Тест.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит Тест.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.12.2012, 14:33     Точка останова #2
ты пытаешься удалить память, не выделявшуюся new
C++
1
2
3
4
5
6
7
8
9
void main()
{
    char *c = new char [5];//присвоение с например c=0xFEF04 по адресу 0xFEF04
// нужно потом освободить память
    c = "1234";  //присвоение с другого адреса 
//например c=0xFEFE0 
    delete [] c;  //попытка освобождения памяти 
//по адресу 0xFEFE0 этот адрес вообще наверно не в куче находится
}
Добавлено через 6 минут
Вот и ошибка. Delete ожидал адрес 0xFEF04
Glide
0 / 0 / 0
Регистрация: 21.12.2012
Сообщений: 3
21.12.2012, 14:33  [ТС]     Точка останова #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
присвоение с другого адреса например c=0xFEFE0
Но как правильно его заполнить?

З.Ы. Извеняюсь за глупые вопросы.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.12.2012, 14:34     Точка останова #4
Цитата Сообщение от Glide Посмотреть сообщение
c = "1234";
собственно здесь как ты понял и есть ошибка. Зачем ты указываешь на этот ненужный строковый литерал?
оператор = всегда будет перенаправлять указатель на другой объект, если ты не знал. В данном случае происходит просто перенаправление указателя вместо выделенной строки на строковый литерал. Нельзя просто так приравнять указатель к чему-то, если он до этого указывал на выделенную память
Очевидно, ты хотел создать КОПИЮ строки в памяти выделенной new
Тогда
C++
1
2
3
4
5
6
void main()
{
    char *c = new char [5];
    strcpy(c, "1234");
    delete [] c;
}
Glide
0 / 0 / 0
Регистрация: 21.12.2012
Сообщений: 3
21.12.2012, 14:45  [ТС]     Точка останова #5
Спасибо, теперь понял.

Добавлено через 2 минуты
Вот только я хотел создать не копию строки, а просто присвоить её к 'с'.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
21.12.2012, 14:56     Точка останова #6
Цитата Сообщение от Glide Посмотреть сообщение
Вот только я хотел создать не копию строки, а просто присвоить её к 'с'.
ну так это нормально. ты создал строку с и заполнил её данными. если ты хотел иметь просто указатель на литерал "1234" мог бы не выделять память, а просто написать с="1234". Но зачем? Изменять его ты не сможешь, предупреждаю!
Yandex
Объявления
21.12.2012, 14:56     Точка останова
Ответ Создать тему
Опции темы

Текущее время: 13:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru