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

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

Войти
Регистрация
Восстановить пароль
 
tapochka
39 / 39 / 8
Регистрация: 25.04.2014
Сообщений: 494
#1

Ошибка в std::copy не ясна - C++

14.07.2015, 01:33. Просмотров 394. Ответов 4
Метки нет (Все метки)

здравствуйте, есть следующий код, в котором возникает ошибка во время выполнения:
C++
1
2
3
std::string array1[5] = { "hello", "hello", "hello", "hello", "hello" };
std::string* arrayptr1 = static_cast<std::string*>(::operator new[](10*sizeof(std::string)));
std::copy(array1, array1+5, arrayptr1);
притом если заменить std::string на int например, то будет все работать. помогите...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2015, 01:33     Ошибка в std::copy не ясна
Посмотрите здесь:

std::copy C++
Ошибка: отсутствует оператор ">>"; типы операндов: std::istream >> std::string C++
C++ ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
C++ std::copy из vector<double> в *double, непонятный warning
C++ Стандартный поток и STL (std::copy to std::cout)
Не получается использовать std::copy как memcpy? C++
C++ Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
C++ Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc выделение памяти
Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc C++
Ошибка в std::cout<<std::endl C++
Std::copy как скопировать часть строки массива byte? C++
C++ Ошибка "non-static data member initializers only available with -std=c++11 or -std=gnu++11"

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
шКодер самоучка
1682 / 1483 / 537
Регистрация: 09.10.2013
Сообщений: 3,355
Записей в блоге: 8
Завершенные тесты: 2
14.07.2015, 01:51     Ошибка в std::copy не ясна #2
У вас здесь написана чушь:
C++
1
std::string* arrayptr1 = static_cast<std::string*>(::operator new[](10*sizeof(std::string)));
Используйте std::vector
C++
1
2
3
4
std::string array1[5] = { "hello", "hello", "hello", "hello", "hello" };
std::vector<std::string> array;
array.resize(5);
std::copy(array1, array1+5, array.begin());
tapochka
39 / 39 / 8
Регистрация: 25.04.2014
Сообщений: 494
14.07.2015, 02:01  [ТС]     Ошибка в std::copy не ясна #3
Cra3y, спасибо, но почему с int работает?

и, если можно, как сделать без вектора? просто сам пытаюсь реализовать вектор, полем данных является указатель на тип элементов

Добавлено через 7 минут
в принципе работает так:
C++
1
2
3
4
5
6
std::string array1[5] = { "hello", "hello", "hello", "hello", "hello" };
std::string* arrayptr1 = static_cast<std::string*>(::operator new[](10*sizeof(std::string)));
for (size_t i = 0; i < sizeof(array1) / sizeof(std::string); i++) {
    new(arrayptr1+i) std::string();
}
std::copy(array1, array1+5, arrayptr1);
но как то это не особо эффективно...
DrOffset
6857 / 4068 / 927
Регистрация: 30.01.2014
Сообщений: 6,867
14.07.2015, 08:56     Ошибка в std::copy не ясна #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от tapochka Посмотреть сообщение
почему с int работает?
Потому что std::string - это класс и у его объектов должны быть вызываны конструкторы
Эта строчка
Цитата Сообщение от tapochka Посмотреть сообщение
static_cast<std::string*>(::operator new[](10*sizeof(std::string)))
только выделяет память под объекты, но не инициализирует их.

Цитата Сообщение от tapochka Посмотреть сообщение
в принципе работает так
А так написать не позволяют священные обеты?
C++
1
2
3
std::string array1[5] = { "hello", "hello", "hello", "hello", "hello" };
std::string* arrayptr1 = new std::string[10];
std::copy(array1, array1+5, arrayptr1);
Или даже так, коль хочется инициализировать память копированием:
C++
1
2
3
std::string array1[5] = { "hello", "hello", "hello", "hello", "hello" };
std::string* arrayptr1 = static_cast<std::string*>(::operator new[](10*sizeof(std::string)));
std::uninitialized_copy(array1, array1+5, arrayptr1);
Цитата Сообщение от tapochka Посмотреть сообщение
но как то это не особо эффективно...
Неэффективно - это держать начальные значения, заданные литералами, в массиве std::string.
tapochka
39 / 39 / 8
Регистрация: 25.04.2014
Сообщений: 494
14.07.2015, 22:35  [ТС]     Ошибка в std::copy не ясна #5
DrOffset, от всей души благодарю за вариант с uninitialized_copy, сам его видел, но не додумался использовать

Цитата Сообщение от DrOffset Посмотреть сообщение
Неэффективно - это держать начальные значения, заданные литералами, в массиве std::string.
делаю свой вектор, поэтому и проверяю для всего что можно
Yandex
Объявления
14.07.2015, 22:35     Ошибка в std::copy не ясна
Ответ Создать тему
Опции темы

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