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

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

Войти
Регистрация
Восстановить пароль
 
Firework
63 / 87 / 23
Регистрация: 01.04.2013
Сообщений: 593
#1

что же на самом деле делает strcpy? - C++

28.09.2013, 22:30. Просмотров 424. Ответов 8
Метки нет (Все метки)

вот такой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
 
int main ()
{
    string buff;
    buff += "what a hell?";
    char* cbuf = new char[buff.size()];
    strcpy(cbuf, buff.c_str());
    delete[] cbuf;  // ...
    return 0;
}
выходит

ОС Windows инициировала точку останова в task2.exe.

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

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

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
как так?
Если убрать delete[] cbuf; то ошибки не будет. Но наверно будет утечка памяти. Как её избежать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что же на самом деле делает strcpy? (C++):

Что такое ссылка на самом деле? - C++
Здравствуйте. Насколько я понимаю, ссылка - это переменная, которая на самом деле является указателем на адрес другой переменной, но с...

Что такое string на самом деле? - C++
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне необходимо из строки string str получить unsignet char* для...

Передача массива в функцию - что на самом деле предается? - C++
Имя массива это константный указатель. Когда мы передаем его в функциюvoid f1(int *iArray) f1 это происходит как pass by reference. В...

Оператор \ выражение - что же это такое на самом деле? - C++
Какого ... выражение называют оператором?

Что делает функция strcpy(t, f) - C++
Функция strcpy(t, f) что она делает?

Число double 0.1 на самом деле не 0.1 - C++
Кто сталкивался с таким глюком, почему если я задаю double x=0.1; в дебаггере я его вижу как 0.10000000000000001 ? я знал что float...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.09.2013, 22:33 #2
нет места на завершающий 0
1
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
28.09.2013, 22:37 #3
C++
1
char* cbuf = new char[buff.size()+1];
1
Firework
63 / 87 / 23
Регистрация: 01.04.2013
Сообщений: 593
28.09.2013, 22:38  [ТС] #4
да точно, но ведь всё равно должен удалять корректно выделенную память
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.09.2013, 22:44 #5
нет, если вышел за границы выделенной памяти, при освобождении будет ошибка... а может и не только при освобождении.
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,030
Записей в блоге: 1
28.09.2013, 22:45 #6
Должен-то должен, но strcpy портит служебную информацию о выделенной памяти.
0
Firework
63 / 87 / 23
Регистрация: 01.04.2013
Сообщений: 593
28.09.2013, 23:20  [ТС] #7
а по-подробнее?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.09.2013, 23:36 #8
Что может быть подробнее? Выделил size() штук байт - не смей использовать ни байта больше
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 23:37 #9
Цитата Сообщение от Firework Посмотреть сообщение
а по-подробнее?
Нулевой символ, копируемый функцией strcpy может затирать информацию о выделенном участке памяти, и при освобождении памяти, оператор delete использует неверную информацию в следствии чего происходит неопределенное поведение программы, в данном случае:
Цитата Сообщение от Firework Посмотреть сообщение
ОС Windows инициировала точку останова в task2.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в task2.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит task2.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 23:37
Привет! Вот еще темы с ответами:

На самом деле #define'а нету. - C++
На самом деле #define нету. Вот например если мы напишем в c++ #define yes 1 #define no 0 то на самом деле мы получим int yes=1; ...

ошибки которых на самом деле нет - C++
possible use of идентификатор before diffinotion(С++) у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены...

Что в программе делает так, что процессор грузится на 100%? - C++
Я не очень разбираюсь в С++, поэтому прошу вашей подсказки по поводу нагрузки на процессор. Вот код программы, на компьютере жрет всю...

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0


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

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

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