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

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

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

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

09.06.2014, 15:27. Просмотров 884. Ответов 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
Всё хорошо, пока дело не касается итераторов. В чём тут кривизна?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2014, 15:27     Копирование памяти под std::string
Посмотрите здесь:

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

std::string - C++
Господа, подскажите где можно поглядеть методы string-a литературы никакой под рукой нет, а гуглить в лоб что-то результаттов не дает. ...

std::string - C++
Здравствуйте! У меня есть std::vector&lt;std::string&gt; Подскажите пожалуйста как быстро и красиво можно перевести i-тый элемент вектора в...

Копирование объектов std::thread - C++
В учебнике Энтони Уильямса есть простой пример класса scoped_thread, присоединяющего поток в деструкторе: class scoped_thread { ...

Копирование std::unique_ptr в структуре - C++
Есть структуры и vector struct myStruct { int a; int b; void* param; }; struct sSetup { int x; int y;

PTCHAR в std::string - C++
Никак не могу парсить переменную Line. Пишет - выражение должно иметь тип класса PTCHAR line = wcstok_s(buffer, TEXT(&quot;\r\n&quot;), &amp;context);...

std::string Трим - C++
Как сделать трим (вырезание из начала\конца строки лишних символов таких как пробелы, табуляции...) в std::string? Я недавно нашёл у себя в...

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

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

Цитата Сообщение от lss Посмотреть сообщение
нормально работают методы
ты их тестировал? один единственный вызов это не тест и не доказательство того что оно работает правильно.
вот поганяй на таких тестах https://github.com/llvm-mirror/libcx...s/basic.string
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 17:21  [ТС]     Копирование памяти под std::string #7
Цитата Сообщение от Jupiter Посмотреть сообщение
потому вопрос "почему?" не уместен
Обычно пишут, что вопрос "почему" неуместен, когда нет ответа.
Цитата Сообщение от Jupiter Посмотреть сообщение
но это вовсе не значит что в копии будут так же расположены сконструированные объекты
А что там может быть ещё расположено? И что это, тогда, за копии объектов?
Есть способ без использования new (любого!) расположить в динамической памяти объекты (типа string), чтобы с ними можно было корректно работать?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 17:27     Копирование памяти под std::string #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;
  }
lss
921 / 851 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2014, 17:47  [ТС]     Копирование памяти под std::string #9
Тот же new, только в обёртке... Без С++11 есть способ (в 10-й студии не компилируется)?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
09.06.2014, 17:51     Копирование памяти под std::string #10
Это раздел по С++, тут надо конструкторы вызывать. Тебе в Си.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.06.2014, 17:58     Копирование памяти под std::string #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 в Си стд::стрингов нет.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.06.2014, 18:02     Копирование памяти под std::string #12
Цитата Сообщение от lss Посмотреть сообщение
Есть способ без использования new (любого!) расположить в динамической памяти объекты (типа string), чтобы с ними можно было корректно работать?
Объект состоит не только из данных, но и из методов. Копировать объекты можно через конструктор копирования. Работать с данными объекта корректно можно только через его методы. Инкапсуляция называется. Смысл размещения именно объекта в куче без new не очень понятен, данные у строки и так в куче. И, на сколько я помню, непрерывность этих данных стандартом не гарантируется. Если не устраивает стандартный аллокатор - есть placement new.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.06.2014, 18:06     Копирование памяти под std::string #13
Цитата Сообщение от Nekto Посмотреть сообщение
Тебе в Си.
В Си string не знают.

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2014, 18:17     Копирование памяти под std::string
Еще ссылки по теме:

std::string, потоки - C++
Доброго времени суток! Использую такую конструкцию: while(...) { while(getline(dic, buf2)) { if (buf2 &lt;...

std::string to SCtring - C++
После выполнения этого кода выводится не &quot;123&quot; а какие-то каракули как это исправить? string s = &quot;123&quot;; ...

std::string в char* - C++
Можно ли привести std::string к указателю на нуль-терминальную строку? Как?

Std::string compare - C++
#include &lt;cstring&gt; #include &lt;iostream&gt; int main() { std::string a = &quot;aa&quot;; std::string b = &quot;ab&quot;; std::cout &lt;&lt;...

Аналог std::string - C++
Имеется некоторый класс, обеспечивающий работу с символами UTF-8. Назовём его uchar. Можно ли простым способом организовать класс ustring,...


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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
09.06.2014, 18:17     Копирование памяти под std::string #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё меня устраивает, вопрос чисто теоретический: что не так в коде, что одни методы работают, а другие (предположительно, которые используют итераторы) нет?
Вариант, что итератор у строки реализован указателем, и оно ну никак не ожидает что его кто-то куда-то скопирует не рассматривается?
Yandex
Объявления
09.06.2014, 18:17     Копирование памяти под std::string
Ответ Создать тему
Опции темы

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