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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Glide
0 / 0 / 0
Регистрация: 21.12.2012
Сообщений: 3
#1

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

21.12.2012, 14:04. Просмотров 1529. Ответов 5
Метки нет (Все метки)

Здравствуйте все!
Не пойму в чём проблема.
Вот так всё работает:
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

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 14:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Точка останова (C++):

точка останова - C++
Доброго времени суток! Если не сложно, объясните в чем ошибка. #include <iostream> #include <conio.h> using namespace std; ...

Не работает (?) точка останова - C++
Ставлю ее перед return, а окно все равно мигом закрывается. Как быть?

Точка останова(повреждение кучи) - C++
Прошу помочь, смотрел по форуму похожие темы - ответа не нашел void Base::Read() { char* name=new char;//переменная для имени ...

Точка останова с восклицательным знаком - C++
В проекте есть несколько точек останова с красным (незакрашенным) кружком и восклицательным знаком. Если навести на такую точку курсор...

C++ delete[] точка останова/повреждение кучи - C++
Добрый день. Подскажите, пожалуйста. Вот код функции: void interpol(point* a, int n, int k, point* y, int inter) //a-original ...

Невразумительная точка останова при выводе double - C++
Возникла небольшая проблемка в коде: void main() { int* mass; mass=(int*)malloc(sizeof(int)); I_List lst; double...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
21.12.2012, 14:56 #6
Цитата Сообщение от Glide Посмотреть сообщение
Вот только я хотел создать не копию строки, а просто присвоить её к 'с'.
ну так это нормально. ты создал строку с и заполнил её данными. если ты хотел иметь просто указатель на литерал "1234" мог бы не выделять память, а просто написать с="1234". Но зачем? Изменять его ты не сможешь, предупреждаю!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2012, 14:56
Привет! Вот еще темы с ответами:

При удалении указателя срабатывает точка останова - C++
В принципе, в заголовке все есть... Добавлю лишь, что я всего лишь маленький ламер, камнями не кидать в случае чего... Тыкните мне носом,...

Условие останова - C++
Привет, ребята. Посоветуйте плиз, как мне задать условие для того, чтобы ввод прекратился? Вот код: int i,choice; for(i=0;i<MAX;i++)...

Вызывание точки останова - C++
Ввести целое число N. Выделить из этого числа цифры, кратные m, и записать их в одномерный массив.-Условие задачи. Ниже моё...

Срабатывание точки останова - C++
Срабатывание точки останова при удалении указателя. Почему так? Кто-нибудь объяснит? #include <iostream> #define RT 100 int main()...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.12.2012, 14:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru