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

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

Войти
Регистрация
Восстановить пароль
 
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
#1

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

28.09.2013, 22:30. Просмотров 402. Ответов 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; то ошибки не будет. Но наверно будет утечка памяти. Как её избежать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
582 / 520 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
28.09.2013, 22:33     что же на самом деле делает strcpy? #2
нет места на завершающий 0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
28.09.2013, 22:37     что же на самом деле делает strcpy? #3
C++
1
char* cbuf = new char[buff.size()+1];
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
28.09.2013, 22:38  [ТС]     что же на самом деле делает strcpy? #4
да точно, но ведь всё равно должен удалять корректно выделенную память
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
28.09.2013, 22:44     что же на самом деле делает strcpy? #5
нет, если вышел за границы выделенной памяти, при освобождении будет ошибка... а может и не только при освобождении.
zer0mail
Заблокирован
28.09.2013, 22:45     что же на самом деле делает strcpy? #6
Должен-то должен, но strcpy портит служебную информацию о выделенной памяти.
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
28.09.2013, 23:20  [ТС]     что же на самом деле делает strcpy? #7
а по-подробнее?
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
28.09.2013, 23:36     что же на самом деле делает strcpy? #8
Что может быть подробнее? Выделил size() штук байт - не смей использовать ни байта больше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2013, 23:37     что же на самом деле делает strcpy?
Еще ссылки по теме:

Ребят что означаеют две звездочки в самом начале когда объявляем массив C++
C++ Что делает operator++
C++ Что делает операция new?
C++ Что такое string на самом деле?
Оператор \ выражение - что же это такое на самом деле? C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4872 / 3011 / 370
Регистрация: 10.11.2010
Сообщений: 11,061
Записей в блоге: 10
Завершенные тесты: 1
28.09.2013, 23:37     что же на самом деле делает strcpy? #9
Цитата Сообщение от Firework Посмотреть сообщение
а по-подробнее?
Нулевой символ, копируемый функцией strcpy может затирать информацию о выделенном участке памяти, и при освобождении памяти, оператор delete использует неверную информацию в следствии чего происходит неопределенное поведение программы, в данном случае:
Цитата Сообщение от Firework Посмотреть сообщение
ОС Windows инициировала точку останова в task2.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в task2.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит task2.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки
Yandex
Объявления
28.09.2013, 23:37     что же на самом деле делает strcpy?
Ответ Создать тему
Опции темы

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