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

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

Войти
Регистрация
Восстановить пароль
 
deniska91
54 / 3 / 3
Регистрация: 17.05.2014
Сообщений: 72
#1

Счетчик в классе string - C++

05.06.2014, 22:47. Просмотров 239. Ответов 4
Метки нет (Все метки)

имеется такой код
C++
1
2
3
4
5
6
...
string s = "Hello world";
string s1;
s1 = s;
s[0] = 'h';
...
В строчке где s1 = s по сути не происходит выделения новой памяти и s1 просто указывает на ту же область памяти, что и s.

Далее, в следующей строчки происходит модификация строки и, так как на одну и ту же область памяти указывают s и s1, то строчка сначала копируется в другую область памяти, а потом модифицируется. В итоге в s теперь строка "hello world", a в s1 - "Hello world".

Из всего этого следует, что имеется счетчик, который содержит в себе количество указателей на выделенную область памяти. Вопрос - а где этот счетчик хранится? Первое предположение, что этот счетчик находится рядом со словом в памяти оказалось ошибочным - смотрел в отладчике, никаких счетчиков в рядом с выделенной памятью нету. Второе предположение, что в классе basic_string есть статическая переменная для этих целей, тоже не увенчалось успехом.

Подскажите кто знает, как все таки это там реализовано? Знаю, что можно посмотреть исходники - смотрел, но не смог разобраться...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2014, 22:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Счетчик в классе string (C++):

String в шаблонном классе - C++
Как сделать так, чтобы в Map<int, std::string> A; работало со string'ом С интами чарами и т.д. все хорошо работает, а на string прога...

Перегруженный оператор = в классе String - C++
Перегруженный оператор = почему то не работает, не могу разобраться в чем проблема, вроде все норм. String &String::operator=(const...

Инициализация массива строк string в классе - C++
Как сделать подскажите? #include <iostream> #include <string> #include <Windows.h> using namespace std; struct structPizza ...

В классе string перегрузить операцию вчитания - C++
Здравствуйте! Помогите, кто сможет. Задание: есть строка например, String s1("123"); и строка String s2("здравствуйте"); написав:...

Сортировка строки по алфавиту в классе String - C++
Здравствуйте! Создал класс Stroka: #include <iostream> #include <string> using namespace std; class Stroka { ...

Что такое _Bx в классе string - C++
Пытаюсь записать дату : time_t rawtime; time(&rawtime); string str = ctime(&rawtime); string dataTime = str; это текст...

4
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2014, 23:14 #2
Цитата Сообщение от deniska91 Посмотреть сообщение
В строчке где s1 = s по сути не происходит выделения новой памяти и s1 просто указывает на ту же область памяти, что и s.
Далее, в следующей строчки происходит модификация строки и, так как на одну и ту же область памяти указывают s и s1, то строчка сначала копируется в другую область памяти, а потом модифицируется.
Откуда такая информация?
1
deniska91
54 / 3 / 3
Регистрация: 17.05.2014
Сообщений: 72
05.06.2014, 23:18  [ТС] #3
Да вот из лекции по С++ с сайта Лекториум.

Прошелся детальнее отладчиком, все таки при присваивании одного стринга другому, строка копируется.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.06.2014, 23:25 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Здесь почитайте, пригодится: http://cpp.com.ru/meyers/ch2.html#t30
1
deniska91
54 / 3 / 3
Регистрация: 17.05.2014
Сообщений: 72
05.06.2014, 23:33  [ТС] #5
Спасибо, это то что нужно
0
05.06.2014, 23:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2014, 23:33
Привет! Вот еще темы с ответами:

string обьявленый в классе передать в параметры конструктора - C++
class String{ char str; string str2; public: String(char string){ strcpy(str,string); } String(string newStr){...

Поле типа string в классе, как и где лежит? - C++
Всем привет! Возник теоретический вопрос. Когда я создаю свой класс и в нем добавляю поле типа string(из стандартной библиотеки) и хочу...

Одновременная реализация константного и неконстантного оператора [] в классе string - C++
Вобщем, проблема в следующем: нужно реализовать обращение по индексу в классе string двумя вариантами оператора : константный (для чтения)...

String в классе (конструктор): когда стоит применять указатели и динамическое выделение памяти? - C++
Добрый вечер всем. Я вот начал писать для себя одну программку по книжке Стэнли Липманна, в общем хочу понять кое-что: предположим, у меня...


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

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

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