Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Firework
98 / 90 / 35
Регистрация: 01.04.2013
Сообщений: 624
1

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

28.09.2013, 22:30. Просмотров 493. Ответов 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
Ответы с готовыми решениями:

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

Что такое string на самом деле?
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне...

Передача массива в функцию - что на самом деле предается?
Имя массива это константный указатель. Когда мы передаем его в функциюvoid...

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

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

8
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
28.09.2013, 22:33 2
нет места на завершающий 0
1
Issues
431 / 366 / 149
Регистрация: 06.08.2012
Сообщений: 961
28.09.2013, 22:37 3
C++
1
char* cbuf = new char[buff.size()+1];
1
Firework
98 / 90 / 35
Регистрация: 01.04.2013
Сообщений: 624
28.09.2013, 22:38  [ТС] 4
да точно, но ведь всё равно должен удалять корректно выделенную память
0
Kuzia domovenok
2397 / 2117 / 510
Регистрация: 25.03.2012
Сообщений: 7,627
Записей в блоге: 1
28.09.2013, 22:44 5
нет, если вышел за границы выделенной памяти, при освобождении будет ошибка... а может и не только при освобождении.
0
zer0mail
2452 / 2089 / 216
Регистрация: 03.07.2012
Сообщений: 7,576
Записей в блоге: 1
28.09.2013, 22:45 6
Должен-то должен, но strcpy портит служебную информацию о выделенной памяти.
0
Firework
98 / 90 / 35
Регистрация: 01.04.2013
Сообщений: 624
28.09.2013, 23:20  [ТС] 7
а по-подробнее?
0
Kuzia domovenok
2397 / 2117 / 510
Регистрация: 25.03.2012
Сообщений: 7,627
Записей в блоге: 1
28.09.2013, 23:36 8
Что может быть подробнее? Выделил size() штук байт - не смей использовать ни байта больше
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 23:37 9
Цитата Сообщение от Firework Посмотреть сообщение
а по-подробнее?
Нулевой символ, копируемый функцией strcpy может затирать информацию о выделенном участке памяти, и при освобождении памяти, оператор delete использует неверную информацию в следствии чего происходит неопределенное поведение программы, в данном случае:
Цитата Сообщение от Firework Посмотреть сообщение
ОС Windows инициировала точку останова в task2.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в task2.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит task2.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
1
28.09.2013, 23:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 23:37

На самом деле #define'а нету.
На самом деле #define нету. Вот например если мы напишем в c++ #define yes 1...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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