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

Сколько живёт строковый литерал? - C++

Войти
Регистрация
Восстановить пароль
 
 
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
06.02.2014, 18:00     Сколько живёт строковый литерал? #1
Имеется код
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
class myClass
{
public:
    myClass(char *s){str=s;}
    void print() {cout << str << endl;}
 
private:
    char *str;
};
 
int main()
{
    myClass a("ne erunda li?");
 
    a.print();
 
    cout << "Hello World!" << endl;
    return 0;
}
Сколько живёт строковый литерал? Не будет ли такой проблемы, что после выходе из конструктора в память, где ранее хранилось "ne erunda li?\0", будет записано что-то ещё?

Кстати, компилятор выдаёт предупреждение с указанием на строчку, где объявляется объект:
C:\Users\Students\Documents\untitled8\main.cpp:17: предупреждение: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
myClass a("ne erunda li?");
^
Как можно это обойти с минимальными изменениями кода класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 18:00     Сколько живёт строковый литерал?
Посмотрите здесь:

Как в макросе передать параметр в строковый литерал? C++
Строковый литерал C++
C++ Дан строковый файл. Создать новый строковый файл, содержащий все строки исходного файла наименьшей длины (в том же порядке).
C++ Строковый литерал и указатель на строку. В чем разница?
C++ Локальный указатель на локальный строковый литерал
C++ Строковый массив (объявить пустой глобальный строковый массив из 16 элементов)
C++ Строквой литерал в двоичном представлении
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
06.02.2014, 23:28     Сколько живёт строковый литерал? #21
Цитата Сообщение от DrARTI Посмотреть сообщение
Я, конечно, очень люблю, когда мне отвечают, но тут слишком многобукафф. Может, получится по-конкретнее немного? Кусок кода там, или синопсис какой-нибудь, не знаю. Я ведь со своим знанием плюсов не пойму иначе ничерта.
Я просто привел ссылку на один из самых авторитетных источников, чтобы не было сомнений в том, что я говорю
Можно концепцию проиллюстрировать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class string_view
{
public:
    typedef char const *   iterator;
    typedef const iterator const_iterator;
 
    string_view(char const * str, size_t len);
    string_view(const_iterator begin, const_iterator end);
    string_view();
 
    const_iterator begin() const;
    const_iterator end() const;
 
    size_t size() const; 
 
    string_view substr(size_t start, size_t len = -1) const;
 
private:
    char const * begin_;
    char const * end_;
};
Представим, что у нас есть некий большой буфер, содержащий строку, которую надо парсить на подстроки. Так как нам нужно данные только читать, то такое решение идеально подойдет. В отличие от обычной строки тут нет расходов на копирование и выделение памяти для подстрок. Каждая подстрока просто "вырезанное" представление части более общей строки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char buf[size] = "very long string for parsing";
 
some_parsing_algo(string_view(buf, size));
//.....
 
void some_parsing_algo(string_view const & str)
{
// все STL алгоритмы с итераторами будут работать
// найдем первый пробел
    string_view::const_iterator space = std::find(str.begin(), str.end(), ' ');
    if(space != str.end())
    {
         // получим подстроку "very"
         string_view sub = str.substr(0, std::distance(str.begin(), space));
    }
}
Реализация методов string_view тривиальна.
Естественно тут нужно следить за временем жизни буфера, который используется в таком представлении.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrARTI
0 / 1 / 0
Регистрация: 25.04.2013
Сообщений: 6
07.02.2014, 00:37     Сколько живёт строковый литерал? #22
DrOffset, очень интересный код, благодарствую!

Добавлено через 15 минут
Сохранил даже, будет полезно в роли примера.
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
07.02.2014, 11:21     Сколько живёт строковый литерал? #23
Цитата Сообщение от DrOffset Посмотреть сообщение
Тоже не очень, обретем проблемы с копированием и последующим двойным удалением. Лучший вариант именно такого подхода - внутри держать std::string какой-нибудь. Либо запретить копирование вообще. Либо реализовать одну из семантик передачи владения.
Смотрим на эту строчку:
C++
1
    myClass(const myClass&);
Объявление конструктора копирования без его определения это и есть запрет копирования.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
12289 / 6976 / 784
Регистрация: 27.09.2012
Сообщений: 17,286
Записей в блоге: 2
Завершенные тесты: 1
07.02.2014, 12:33     Сколько живёт строковый литерал? #24
Цитата Сообщение от Ilot Посмотреть сообщение
это и есть запрет копирования.
который сработает только на стадии линковки...
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
07.02.2014, 13:43     Сколько живёт строковый литерал? #25
Цитата Сообщение от Ilot Посмотреть сообщение
Смотрим на эту строчку:
C++
1
    myClass(const myClass&);
Объявление конструктора копирования без его определения это и есть запрет копирования.
Запретом копирования это было бы будь оно в привате. Либо, в рамках нового стандарта объявлено как
C++
1
myClass(const myClass&) = delete;
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
07.02.2014, 14:02     Сколько живёт строковый литерал? #26
DrOffset, тогда попрбуйте скомпилировать такой код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A{
    int a;
public:
    A(int a1): a(a1)
    {}
    A(const A&);
};
int main()
{
    A obj1(11);
    A obj2 = obj1;
 
    return 0;
}

Croessmah, как бы мысль понял. А как это проверить на стадии выполнения программы? Не совсем понимаю. Пусть даже компилятор пропустит код без определения конструктора все равно во время выполнения программы произойдет обращение к несуществующей функции и по идее программа должна "слететь". Так? Т.е. другими словами копирования объектов все-равно не произойдет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 14:12     Сколько живёт строковый литерал?
Еще ссылки по теме:

Литерал - что делать с указателем? C++
C++ Передать литерал функции
C++ Какое получается значение и тип имеет литерал 3.14e1L
Что такое широкий литерал? C++
C++ Литерал это значение любой переменой, ведь так ?

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

Или воспользуйтесь поиском по форуму:
DrOffset
6795 / 4006 / 920
Регистрация: 30.01.2014
Сообщений: 6,830
07.02.2014, 14:12     Сколько живёт строковый литерал? #27
Цитата Сообщение от Ilot Посмотреть сообщение
DrOffset, тогда попрбуйте скомпилировать такой код:
Croessmah, как бы мысль понял.
Кажется с его стороны это был сарказм. Код, который вы дали приводит к unresolved external во время линковки. Croessmah и я вам как бы намекали, что это слишком поздно и неплохо бы это отловить еще на этапе компиляции! Для этого сейчас в новом стандарте есть стандартное средство.

Цитата Сообщение от Ilot Посмотреть сообщение
А как это проверить на стадии выполнения программы? Не совсем понимаю. Пусть даже компилятор пропустит код без определения конструктора все равно во время выполнения программы произойдет обращение к несуществующей функции и по идее программа должна "слететь". Так? Т.е. другими словами копирования объектов все-равно не произойдет?
Не нужно проверять на этапе выполнения Прочитайте еще раз пожалуйста мое предыдущее сообщение. Чтобы запретитькопирование с диагностикой на этапе компиляции в С++98 и С++03 конструктор копирования помещают в приват без реализации. См. например boost::noncopyable. В С++11 для запрещения каких либо операций с классом ввели стандартное средство, которое я демонстрировал
Yandex
Объявления
07.02.2014, 14:12     Сколько живёт строковый литерал?
Ответ Создать тему
Опции темы

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