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

Куда деваются одномоментные указатели, или управление памятью в работе с std::string - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найдите максимальное k, для которого можно соответствующим образом выбрать 2k + 1 день http://www.cyberforum.ru/cpp-beginners/thread1163408.html
Группа альпинистов покорила много вершин и возвратилась в родной город. Одна из местных газет решила написать статью об их походе. Как выяснилось, в процессе похода альпинисты N раз останавливались на ночлег на той или иной высоте. Поскольку главный редактор газеты настаивает, чтобы название статьи было “Восхождение и спуск”, решено было не упоминать о некоторых днях похода, рассказав лишь о...
C++ Вывести в алфавитном порядке все уникальные символы Доброго времени суток! Вопрос: задан массив из К символов латинского алфавита. Вывести на экран в алфавитном порядке все символы, которые входят в этот массив по одному разу. У меня не выходит сделать цикл по удалению повторяющихся элементов. Спасибо заранее вот код: #include "stdafx.h" #include <iostream> #include <time.h> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread1163407.html
C++ Форматы чисел, циклы | задача
Дано n вещественных чисел. Найти количество тех из них, которые после усечения стали больше 15 , четны и кратны 5.
Программа удаленного управления компьютерами в сетях используя объектно-ориентированную технологию с++ C++
Вообщем, нужна написать программу которая обеспечивает: - удаленный доступ к клиенту, позволяя открывать и редактировать файлы, запускать программы и выполнять работу с помощью локальной или глобальной сети; - удаленное управление и просмотр удаленного рабочего стола клиента - удаленное управление питанием компьютера клиента; - удаленное управление компьютером клиента через командную...
C++ Динамическое создание экземпляров класса http://www.cyberforum.ru/cpp-beginners/thread1163381.html
Здравствуйте, у меня следующий вопрос: Я пытаюсь создать что-то на подобии очереди из автомата. Для этого я использую SFML. Как известно, из автомата летят пули. Для этого я решил использовать массив, динамический массив. Но проблема заключается в том, что при "попадании в цель" этот элемент массива должен уничтожаться, а на его место вставать новый. Подскажите, пожалуйста, как это реализовать....
C++ Разбить строку на слова, добавить эти слова в массив строк Привет всем! Понадобилось решить одну простенькую задачку: Разбить строку на слова, добавить эти слова в массив строк, вывести содержимое массива строк. Попытался сделать сам,написал что-то быдлокодерское)) #include <iostream> #include <string> подробнее

Показать сообщение отдельно
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
01.05.2014, 16:30     Куда деваются одномоментные указатели, или управление памятью в работе с std::string
Здравствуйте!

Положим, у нас есть функция, возвращающая строку std::string, выглядящая как-то так:
C++
1
2
3
4
std::string getHome()
{
    return getenv("HOME");
}
Но есть один момент.
Если возвращаемое значение довольно большое, то подобная операция может быть слишком затратной. Я так понимаю, что для вызовов подобных методов компилятор генерирует что-либо такое:

C++
1
2
// Начало
std::string s = getHome();
Начало:
<Вызов метода getHome() - сохранение данных о вызове метода, если не inline>
<Выполнение команды getenv -> выделение памяти под значение в функции>
<Возврат из метода -> Выделение памяти под s на основании полученных данных>
<Копирование из выделенной памяти в методе в s>

С другой стороны, компилятор может сделать так, чтобы использовалось только память, выделенная в s.

Таким образом, первый вопрос: для подобных методов память выделяется дважды или один раз?

Далее. Пытаясь справиться с этим, я заменил сигнатуру getHome() на это:
C++
1
2
3
4
std::string& getHome()
{
    return getenv("HOME");
}
Компилятор ругнулся на меня понятием временного объекта. И, честно говоря, я его прекрасно понимаю.
Правда, именно из-за этой ситуации я решил, что память выделяется дважды.
Далее. Переделываем возвращаемое значение метода на указательное:
C++
1
2
3
4
std::string* getHome()
{
    return new std::string(getenv("HOME"));
}
Вроде бы все хорошо. Память выделяется только один раз, гарантированно, но...
А если мы используем подобное в выражениях типа:
C++
1
std::string s = "Your home dir is ..." + *getHome();
Итак, если я правильно понимаю внутреннее устройство std::string, для результирующей строки у нас выделяется новая память и туда _копируется_ содержимое обоих строк.
Стоп, а куда девается память, выделенная getHome()!? Она-ж зарезервирована! Утечка!
Можно, конечно, сделать вот так:
C++
1
2
3
std::string *pointer = getHome();
std::string s = "Nja" + *pointer;
delete pointer;
Но, как-то это все... слишком коряво...

И еще одно: сигнатуры некоторых методов из стандартной библиотеки для работы с std::string возвращают std::string&.
Как они это делают? Создают новый указатель - т. е. выделяют в куче независимо от меня память? А иначе же lvalue... И мне ее потом очищать вручную?

Собственно, как грамотно работать с std::string с точки зрения память, какие возращаемые типы указывать для подобных одномоментных функций, подобных указанной выше? Почему стандартные методы из std::string часто возвращают ссылку?
Генерирует ли компилятор двойное выделение памяти (и, как следствие, копирование возвращаемого значения)? Зависит ли это от степени оптимизации? Что происходит при контакенции строк при использовании std::string - если создается новая строка, использующая новую память, как очищать предыдущие ненужные? Как вообще грамотно распределять память в подобных случаях?

P. S. прошу заранее простить за несколько сумбурный и несколько несвязный стиль изложения.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru