Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
1

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

01.08.2012, 20:09. Просмотров 704. Ответов 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;
}
Во втором примере разве не должны были указатели иметь разные адреса? Или компилятор, когда находит строку, то он ее сравнивает со строками, хранящимися где-то, и если совпадают, то новую память не выделяет, а возвращает уже адрес на память выделенную раньше? Каша в голове...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2012, 20:09
Ответы с готовыми решениями:

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

Где храняться скрипты на страницах?
Здравствуйте. Я не знаю javascript и не писал сайтов, подскажите где могут храниться скрипты...

Где храняться иконки для LibreOffice?
И так. Есть у меня LO. Поскольку мне не нравятся их выпуклые всякие кнопки, да мне вообще выпуклые...

Где можно посмотреть когда включался и когда выключался компьютер?
Всем привет! Где я смогу посмотреть когда включался и когда выключался компьютер? Мне сказали, что...

13
Каратель
Эксперт С++
6598 / 4019 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.08.2012, 20:31 2
https://www.cyberforum.ru/blogs/18334/blog97.html

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

Добавлено через 3 минуты
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему не выдает ошибки?
не выдает ошибки для поддержки обратной совместимости, слишком много кодов с таким
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
char * n = "TORIN"
вот
1
Заблокирован
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 Посмотреть сообщение
Во втором примере разве не должны были указатели иметь разные адреса?
указатели имеют разные адреса. Адрес литерала, на который они указывают один.
1
В астрале
Эксперт С++
8029 / 4786 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
02.08.2012, 00:16 4
alkagolik,
C++
1
char* n = "blablabla"
печаль однако. сброс константности.
0
Заблокирован
02.08.2012, 00:19 5
ForEveR, печально char* в c++.
0
В астрале
Эксперт С++
8029 / 4786 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
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;
}
0
2 / 2 / 1
Регистрация: 21.11.2011
Сообщений: 183
02.08.2012, 00:34  [ТС] 7
Цитата Сообщение от Jupiter Посмотреть сообщение
именно
,
Цитата Сообщение от Jupiter Посмотреть сообщение
https://www.cyberforum.ru/blogs/18334/blog97.html
- Спасибо!

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


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

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

Не по теме:

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


Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...
ну почему же неявным. Очень даже явным. В процессе компиляции все что возможно компилятор аккуратно укладывает в стек программы. Туда же и поместился константный строковый литерал. Начнешь ассемблеры учить, все поймешь.
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Почему печально char* в C++? Что не бывает случаев, когда полезней char* вместо string использовать?
Ну как бы не труЪ. Оно конечно cstyle компиляторами поддерживается, но если уж хочется писать на Си и чтобы еще полезней, так лучше писать на Си, а то суржик получается.
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 05:12 11
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name
В конструкторе у вас ничего не определяется, а значит и память ни под что не выделяется. Конструктор это процедура инициализации объекта, а не создания объекта(выделения памяти под объект). name - это поле класса. Память под неё выделяется при создании объекта класса. У вас объект создаётся в функции main(). Освобождение памяти, занимаемой этим объектом, произойдёт при выходе из main().
https://www.cyberforum.ru/blogs/18334/blog103.html
0
Evg
Эксперт CАвтор FAQ
21147 / 8163 / 628
Регистрация: 30.03.2009
Сообщений: 22,463
Записей в блоге: 30
02.08.2012, 09:05 12
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Я не много другое спрашивал (мне просто было непонятно, почему при завершении работы конструктора, не освобождается память из под локальной переменной name, а она как оказалось неявным образом статическая...)
name - это всего лишь указатель. А в статической памяти находится строковой литерал. Строковой литерал живёт всё время исполнения программы. Указатель name живёт лишь на то время, пока существует объект Hero

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

Не по теме:

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

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

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создать массив B[1.. N], где bi=1, когда все элементы i-й строки двух матриц имеют одинаковые знаки, иначе bi=0
1)дана целочисленная квадратная матрица n.Найти последовательность из нулей и единиц b1,..bn...

Где удаляются Implicit Sharing объекты?
Если я сигналом пошлю QByteArray из одного потока. signals: void sendSig(QByteArray sig); ...

Если длина строки >5, то из строки удаляются все точки.
Длина L &gt;5, то удаляются все точки.

Не удаляются компоненты с формы B XE8 и где XE10
Здравствуйте. При создании любого компонента на форме андроида я не могу его потом удалить....


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

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

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