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

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

Войти
Регистрация
Восстановить пароль
 
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

С-строки. Где храняться? Когда удаляются? - C++

01.08.2012, 20:09. Просмотров 615. Ответов 13
Метки нет (Все метки)

есть, к примеру, такой класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Hero
{
private:
   char * name;    
 
public:
   Hero(char * n = "TORIN")
   {
        this->name = n;
   }
 
   char * get_name()
   {
        return name;
   }
};
C++
1
2
3
4
5
6
int main(void)
{
    Hero h;
    cout << h.get_name();
    return 0;
}
Почему не выдает ошибки? "char * n" в параметрах конструктора определена, т.е.локально...

пример 2.

C++
1
2
3
4
5
6
7
int main(void)
{
    char * p1 = "Kotik"; // к примеру, адрес, который получает p1, равен 003454e0
    char * p2 = "Kotik"; //тогда и p2 получает тот же адрес, т.е. 003454e0
    cout << h.get_name();
    return 0;
}
Во втором примере разве не должны были указатели иметь разные адреса? Или компилятор, когда находит строку, то он ее сравнивает со строками, хранящимися где-то, и если совпадают, то новую память не выделяет, а возвращает уже адрес на память выделенную раньше? Каша в голове...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 20:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С-строки. Где храняться? Когда удаляются? (C++):

Где в памяти храняться данные моего приложения? - C++
Добрый день! Подскажите кто знает, у меня тут пара нубских вопросов: 1. Вот когда я создаю данные какого - нибуть типа, например DWORD...

Программа должна определить длину введенной строки L и, если длина L >15, то удаляются все a..z. - C++
27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши &quot;Ввод&quot;. Программа должна определить длину...

C++ Что?Где?Когда? - C++
Осталось 2 дня,прошу кратко объяснить что мне нужно читать на каждое из заданий см.вложение Очень нуждаюсь в помощи, потому что 0 в Си...

Определить длину введенной строки L, и если длина L четная, то удаляются 3 первых, иначе 3 последних символа - C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;stdio.h&quot; #include &quot;string.h&quot; #include &quot;stdlib.h&quot; int _tmain(int argc,...

В строковом массиве храняться фамилии и инициалы учеников класса. - C++
В строковом массиве храняться фамилии и инициалы учеников класса.Требуется напечатать список класса с указанием для каждого ученика...

Когда и где следует использовать механизм исключительных ситуаций? - C++
Раньше при написании Си подобных программ всегда возвращал из функции число или булеву переменную, чтобы понять статус происходящего (...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2012, 20:31 #2
http://www.cyberforum.ru/blogs/18334/blog97.html

Добавлено через 36 секунд
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Или компилятор, когда находит строку, то он ее сравнивает со строками, хранящимися где-то, и если совпадают, то новую память не выделяет, а возвращает уже адрес на память выделенную раньше?
именно

Добавлено через 3 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему не выдает ошибки?
не выдает ошибки для поддержки обратной совместимости, слишком много кодов с таким
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
char * n = "TORIN"
вот
alkagolik
Заблокирован
01.08.2012, 21:47 #3
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему не выдает ошибки? "char * n" в параметрах конструктора определена, т.е.локально...
потому что невнимательно читаешь учебники. У тебя конструктор с параметром по умолчанию, и если ты создаешь объект без указания параметра инициализации, то он инициализируется параметром по умолчанию. Невнятно написал, но разберешь и поймешь.
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class foo {
    public:
        char* get_name() {
            return name;
        }
 
        foo( char* n = "blablabla" ) : name( n ) {}
 
    private:
        char* name;
};
 
int main() {
    
    foo x, y("123123123");
    std::cout << x.get_name() << "\t" << y.get_name() << std::endl;
    
    return 0;
}

Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Во втором примере разве не должны были указатели иметь разные адреса?
указатели имеют разные адреса. Адрес литерала, на который они указывают один.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.08.2012, 00:16 #4
alkagolik,
C++
1
char* n = "blablabla"
печаль однако. сброс константности.
alkagolik
Заблокирован
02.08.2012, 00:19 #5
ForEveR, печально char* в c++.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.08.2012, 00:26 #6
alkagolik, Согласен абсолютно, но следуя стандарту пример стоит немного поменять.

Ordinary string literals and UTF-8 string literals are also referred to as narrow string literals. A narrow
string literal has type “array of n const char”, where n is the size of the string as defined below, and has
static storage duration
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
class foo {
    public:
        const char* get_name() const {
            return name;
        }
 
        foo( const char* n = "blablabla" ) : name( n ) {}
 
    private:
        const char* name;
};
 
int main() {
    
    foo x, y("123123123");
    std::cout << x.get_name() << "\t" << y.get_name() << std::endl;
    
    return 0;
}
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
02.08.2012, 00:34  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
именно
,
Цитата Сообщение от Jupiter Посмотреть сообщение
http://www.cyberforum.ru/blogs/18334/blog97.html
- Спасибо!

Цитата Сообщение от alkagolik Посмотреть сообщение
то он инициализируется параметром по умолчанию
- Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...), коряво возможно задал вопрос, извиняюсь=)


Цитата Сообщение от ForEveR Посмотреть сообщение
alkagolik, Код C++
1 char* n = "blablabla"
печаль однако. сброс константности.
- да, накосячил.

Цитата Сообщение от ForEveR Посмотреть сообщение
alkagolik, Согласен абсолютно, но следуя стандарту пример стоит немного поменять.
- Почему печально char* в C++? Что не бывает случаев, когда полезней char* вместо string использовать?
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.08.2012, 00:38 #8
Alberto_Timakov, Только с Си API (и мб других языков куда можно передать только указатель, не объект). В других случаях очевидно предпочтительнее string.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
02.08.2012, 00:40  [ТС] #9
Добавлено через 26 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
Alberto_Timakov, Только с Си API (и мб других языков куда можно передать только указатель, не объект). В других случаях очевидно предпочтительнее string.
СПасибо
alkagolik
Заблокирован
02.08.2012, 02:11 #10

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Согласен абсолютно, но следуя стандарту пример стоит немного поменять.
пример был таким изначально, испортился


Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...
ну почему же неявным. Очень даже явным. В процессе компиляции все что возможно компилятор аккуратно укладывает в стек программы. Туда же и поместился константный строковый литерал. Начнешь ассемблеры учить, все поймешь.
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему печально char* в C++? Что не бывает случаев, когда полезней char* вместо string использовать?
Ну как бы не труЪ. Оно конечно cstyle компиляторами поддерживается, но если уж хочется писать на Си и чтобы еще полезней, так лучше писать на Си, а то суржик получается.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 05:12 #11
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name
В конструкторе у вас ничего не определяется, а значит и память ни под что не выделяется. Конструктор это процедура инициализации объекта, а не создания объекта(выделения памяти под объект). name - это поле класса. Память под неё выделяется при создании объекта класса. У вас объект создаётся в функции main(). Освобождение памяти, занимаемой этим объектом, произойдёт при выходе из main().
http://www.cyberforum.ru/blogs/18334/blog103.html
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 378
Регистрация: 30.03.2009
Сообщений: 16,155
Записей в блоге: 26
02.08.2012, 09:05 #12
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...)
name - это всего лишь указатель. А в статической памяти находится строковой литерал. Строковой литерал живёт всё время исполнения программы. Указатель name живёт лишь на то время, пока существует объект Hero

Цитата Сообщение от alkagolik Посмотреть сообщение
Очень даже явным. В процессе компиляции все что возможно компилятор аккуратно укладывает в стек программы. Туда же и поместился константный строковый литерал
Неправда. Строковой литерал НЕ помещался в стек. Он живёт в глобальной памяти
alkagolik
02.08.2012, 15:18
  #13

Не по теме:

Evg, ну да, конечно, пардон.

Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
02.08.2012, 21:57  [ТС] #14
Цитата Сообщение от alkagolik Посмотреть сообщение
Начнешь ассемблеры учить, все поймешь.
- это наверное долго...В общем, спасибо, учту=)))

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
name - это всего лишь указатель. А в статической памяти находится строковой литерал. Строковой литерал живёт всё время исполнения программы. Указатель name живёт лишь на то время, пока существует объект Hero
- это понял прочитав вашу статью, спасибо!=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 21:57
Привет! Вот еще темы с ответами:

Когда и где следует использовать механизм исключительных ситуаций? - C++
Вечер добрый, товарищи. Вопрос у меня в общем-то теоретический и, наверное, размытый, общий. Когда и где следует использовать...

Ввести строку символов. Определить длину введенной строки L, и если длина L кратна 3, то удаляются все символы, стоящие на местах с номером кратным 3 - C++
!!!!!

Массив: Найти произведение двух верхнеугольных матриц, которые храняться в упакованном виде в одномерных массивах. - C++
Найти произведение двух верхнеугольных матриц,которые храняться в упакованном виде в одномерных масивах.

Культура оформления кода: что такое enum? Где, когда и для чего уместно применять этот тип? - C++
не понял за что отвечают эти две строчки: enum ChosenOperation { ADD = 1, SHOW, SEARCH, EXIT }; enum SearchingCriteria { NAME =...


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

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

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