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

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

Войти
Регистрация
Восстановить пароль
 
 
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
#1

Копирование памяти под std::string - C++

09.06.2014, 15:27. Просмотров 905. Ответов 28
Метки нет (Все метки)

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    const int N = 3;
    string* pstr = (string*)malloc(sizeof(string) * N);
    
    string arrstr[N];
    memcpy(pstr, arrstr, sizeof(string) * N);
    
    pstr[0] = "string0";
    pstr[1] = "string1";
    pstr[2] = "string2";
    
    for (int i = 0; i < 3; ++i)
        cout << pstr[i] << endl;
    
    for (int i = 0; i < 3; ++i)
        pstr[i].append("app");
    for (int i = 0; i < 3; ++i)
        cout << pstr[i] << endl;
    
    for (int i = 0; i < 3; ++i)
        pstr[i].assign("assign");
    for (int i = 0; i < 3; ++i)
        cout << pstr[i] << endl;
    
    // cout << *(pstr[0].begin()) << endl; // ошибка: string iterator not dereferencable
    // pstr[0].push_back('W'); // ошибка: string iterator + offset out of range
Всё хорошо, пока дело не касается итераторов. В чём тут кривизна?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2014, 15:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Копирование памяти под std::string (C++):

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri - C++
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ - C++
private: std::string firstName; }; std::string ClientData::getFirstName() const{ return firstName; } Дает в итоге...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами - C++
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...

Выделение памяти под string (разъяснения) - C++
Всем привет. Можете проконсультировать меня по некоторым вопросам связанные с выделением памяти под класс string. Вопрос 1. ... ...

Реализация класса MyString. Стандартная библиотека, std::string, std::vector - C++
как добавить реализацию конкатенации строк через перегрузку оператора &quot;+=&quot; в классе MyString и почему ошибка выдается???#include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 15:29 #2
C++
1
2
3
4
string* pstr = (string*)malloc(sizeof(string) * N);
    
    string arrstr[N];
    memcpy(pstr, arrstr, sizeof(string) * N);
Что это и зачем такой изврат в с++?
0
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 15:38  [ТС] #3
Цитата Сообщение от Nekto Посмотреть сообщение
Что это и зачем такой изврат в с++?
Вопрос чисто теоретический.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.06.2014, 16:34 #4
Цитата Сообщение от lss Посмотреть сообщение
В чём тут кривизна?
malloc не вызывает конструктор
1
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 16:42  [ТС] #5
Цитата Сообщение от Jupiter Посмотреть сообщение
malloc не вызывает конструктор
Знаю. В динамическую память, в коде, копируются уже сконструированные string-и (или не так?). Почему нормально работают методы, которые, если правильно понимаю, не используют итераторов (или не так?), и не нормально - с итераторами (push_back)?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.06.2014, 17:08 #6
Цитата Сообщение от lss Посмотреть сообщение
В динамическую память, в коде, копируются уже сконструированные string-и (или не так?)
копируется область памяти в которой расположены сконструированные объекты, но это вовсе не значит что в копии будут так же расположены сконструированные объекты

Цитата Сообщение от lss Посмотреть сообщение
Почему нормально работают методы, которые, если правильно понимаю, не используют итераторов (или не так?), и не нормально - с итераторами (push_back)?
ты написал bullshit потому вопрос "почему?" не уместен

Цитата Сообщение от lss Посмотреть сообщение
нормально работают методы
ты их тестировал? один единственный вызов это не тест и не доказательство того что оно работает правильно.
вот поганяй на таких тестах https://github.com/llvm-mirror/libcx...s/basic.string
1
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 17:21  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
потому вопрос "почему?" не уместен
Обычно пишут, что вопрос "почему" неуместен, когда нет ответа.
Цитата Сообщение от Jupiter Посмотреть сообщение
но это вовсе не значит что в копии будут так же расположены сконструированные объекты
А что там может быть ещё расположено? И что это, тогда, за копии объектов?
Есть способ без использования new (любого!) расположить в динамической памяти объекты (типа string), чтобы с ними можно было корректно работать?
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 17:27 #8
Цитата Сообщение от lss Посмотреть сообщение
Обычно пишут, что вопрос "почему" неуместен, когда нет ответа.

А что там может быть ещё расположено? И что это, тогда, за копии объектов?
Есть способ без использования new (любого!) расположить в динамической памяти объекты (типа string), чтобы с ними можно было корректно работать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <memory>
#include <string>
 
int main()
  {
  auto string_in_heap = std::make_unique<std::string>();
  string_in_heap->append("test");
  std::cout << *string_in_heap << std::endl;
  for (auto it = string_in_heap->begin(); it != string_in_heap->end(); ++it)
    std::cout << *it;
  std::cout << std::endl;
  std::cin.get();
  return 0;
  }
1
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 17:47  [ТС] #9
Тот же new, только в обёртке... Без С++11 есть способ (в 10-й студии не компилируется)?
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 17:51 #10
Это раздел по С++, тут надо конструкторы вызывать. Тебе в Си.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
09.06.2014, 17:58 #11
Цитата Сообщение от Jupiter Посмотреть сообщение
ты написал bullshit
нет, ты ответил bullshit.
Правильный ответ - нечто вроде такого: "почитай про placement new"
C++
1
2
3
4
5
6
7
8
9
const int N = 3;
void*   raw_mem = malloc(sizeof(string) * N);
string* pstr= new (pstr) string[N];
pstr[0] = "string0";
pstr[1] = "string1";
pstr[2] = "string2";
int i=N;
while (i)
 pstr[--i].~string();
Добавлено через 44 секунды
Цитата Сообщение от Nekto Посмотреть сообщение
Это раздел по С++, тут надо конструкторы вызывать. Тебе в Си.
и ты ответил bullshit в Си стд::стрингов нет.
2
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.06.2014, 18:02 #12
Цитата Сообщение от lss Посмотреть сообщение
Есть способ без использования new (любого!) расположить в динамической памяти объекты (типа string), чтобы с ними можно было корректно работать?
Объект состоит не только из данных, но и из методов. Копировать объекты можно через конструктор копирования. Работать с данными объекта корректно можно только через его методы. Инкапсуляция называется. Смысл размещения именно объекта в куче без new не очень понятен, данные у строки и так в куче. И, на сколько я помню, непрерывность этих данных стандартом не гарантируется. Если не устраивает стандартный аллокатор - есть placement new.
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.06.2014, 18:06 #13
Цитата Сообщение от Nekto Посмотреть сообщение
Тебе в Си.
В Си string не знают.

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Правильный ответ - нечто вроде такого: "почитай про placement new"
Kuzia domovenok, я это всё знаю. С new (любым) проблем нет.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 18:09 #14
Цитата Сообщение от alsav22 Посмотреть сообщение
В Си string не знают.

Не по теме:

Это их проблемы

0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.06.2014, 18:17 #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё меня устраивает, вопрос чисто теоретический: что не так в коде, что одни методы работают, а другие (предположительно, которые используют итераторы) нет?
Вариант, что итератор у строки реализован указателем, и оно ну никак не ожидает что его кто-то куда-то скопирует не рассматривается?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 18:17
Привет! Вот еще темы с ответами:

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

Операция std::cout для Объекта типа std::string - C++
Кто детально объяснит почему не выводит ? Дает вот так &quot;Отсутствует оператор &quot;&lt;&lt;&quot;, соответствующий этим операндам&quot; void...

Почему std::string_view МЕДЛЕННЕЕ, чем std::string? - C++
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до нескольких гигабайт). Почему в...

Как правильно перевести std::wstring в std::string ? - C++
Собственно как? :)


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

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

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