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

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

Восстановить пароль Регистрация
 
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
01.08.2012, 20:09     С-строки. Где храняться? Когда удаляются? #1
есть, к примеру, такой класс

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++ Где в памяти храняться данные моего приложения?
Программа должна определить длину введенной строки L и, если длина L >15, то удаляются все a..z. C++
C++ В строковом массиве храняться фамилии и инициалы учеников класса.
C++ Ввести строку символов. Определить длину введенной строки L, и если длина L кратна 3, то удаляются все символы, стоящие на местах с номером кратным 3
C++ Определить длину введенной строки L, и если длина L четная, то удаляются 3 первых, иначе 3 последних символа
C++ Когда можно не описывать длину строки
Массив: Найти произведение двух верхнеугольных матриц, которые храняться в упакованном виде в одномерных массивах. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 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
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.08.2012, 00:16     С-строки. Где храняться? Когда удаляются? #4
alkagolik,
C++
1
char* n = "blablabla"
печаль однако. сброс константности.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
02.08.2012, 00:19     С-строки. Где храняться? Когда удаляются? #5
ForEveR, печально char* в c++.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
02.08.2012, 02:11     С-строки. Где храняться? Когда удаляются? #10

Не по теме:

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


Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...
ну почему же неявным. Очень даже явным. В процессе компиляции все что возможно компилятор аккуратно укладывает в стек программы. Туда же и поместился константный строковый литерал. Начнешь ассемблеры учить, все поймешь.
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему печально char* в C++? Что не бывает случаев, когда полезней char* вместо string использовать?
Ну как бы не труЪ. Оно конечно cstyle компиляторами поддерживается, но если уж хочется писать на Си и чтобы еще полезней, так лучше писать на Си, а то суржик получается.
alsav22
5284 / 4803 / 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
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,353
Записей в блоге: 26
02.08.2012, 09:05     С-строки. Где храняться? Когда удаляются? #12
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...)
name - это всего лишь указатель. А в статической памяти находится строковой литерал. Строковой литерал живёт всё время исполнения программы. Указатель name живёт лишь на то время, пока существует объект Hero

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 21:57     С-строки. Где храняться? Когда удаляются?
Еще ссылки по теме:

Когда и где следует использовать механизм исключительных ситуаций? C++
C++ Используя класс list, в котором храняться фамилии студентов группы, организовать поиск по фамилии
C++ Когда и где следует использовать механизм исключительных ситуаций?
Культура оформления кода: что такое enum? Где, когда и для чего уместно применять этот тип? C++
C++ Что?Где?Когда? C++

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

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

Добавлено через 4 минуты
Цитата Сообщение от Evg Посмотреть сообщение
name - это всего лишь указатель. А в статической памяти находится строковой литерал. Строковой литерал живёт всё время исполнения программы. Указатель name живёт лишь на то время, пока существует объект Hero
- это понял прочитав вашу статью, спасибо!=)
Yandex
Объявления
02.08.2012, 21:57     С-строки. Где храняться? Когда удаляются?
Ответ Создать тему
Опции темы

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