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

После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? - C++

Восстановить пароль Регистрация
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
07.07.2015, 19:47     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class abc
    {
    public:
        int argc;
        char **argv;
        char **azColName;
    };
 
std::list<abc> Result;
 
test()
{
abc* abcMy = new abc(); 
Result.push_back(*abcMy);
delete abcMy;
}
После выполнения (завершения) функции test переменная умрет, а что будет с это переменной в Result?
То есть собственно функция push_back создаст копию переменной и пометит ее в Result или я моя переменная в Result удалиться при вызове delete abcMy;?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 19:47     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?
Посмотрите здесь:

C++ какое значение примет переменная s после выполнения следующих операторов
C++ какое значение примет переменная s после выполнения следующих операторов
Каким будет значение переменной k после вызова функции f в main: C++
C++ Что будет выведено после выполнения следующего фрагмента программы:
C++ Чему будет равно значение переменной s после выполнения следующего фрагмента программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetVariable
 Аватар для GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
07.07.2015, 19:50     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #2
В конкретном случае, в Result кладётся копия объекта acbMy, т.е. по логике, после выхода за пределы test, ничего с объектами в контейнере Result не должно произойти.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
07.07.2015, 19:51     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #3
в данном случае в список поместится копия объекта.
эта копия удалится автоматически вместе со списком при выходе переменной Result из области видимости(либо по окончанию программы, если Result - глобальная переменная)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.07.2015, 20:05     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #4
klynxe, стандартные контейнеры хранят копии объектов. Вот если бы у тебя был std::list<abc*>, то под копией уже понимался бы указатель, и в таком случае, после освобождение памяти по указателю обращаться к данным, полученным из списка уже нельзя. Т.е. можно считать сам указатель (так как он скопировался при вставке), но нельзя использовать данные по этому указателю (т.е. разыменовывать его).
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
07.07.2015, 20:43  [ТС]     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #5
Еще вопрос, а как вывести
int argc;
char **argv;
char **azColName;
из списка?)

Result[0].argc не работает(

Нужно пройти весь вектор
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
07.07.2015, 21:00     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
klynxe, список на то он и список, что поддерживает быстрое добавление элементов, но не имеет доступа по индексу
для доступа к первому элементу есть std::list::front(), к последнему - std::list::back()
для доступа к остальным элементам нужно сначала дойти до нужного
последовательный перебор элементов в списке:
C++
1
2
3
4
5
6
7
8
9
10
std::list<int> lst;
for(std::list<int>::iterator it = lst.begin(); it != it.end(); ++it) {
    std::cout << *it << std::endl;
}
/*
// ranged for c++11
for(auto& item : lst) {
   std::cout << item << std::endl;
}
*/
для перебора с конца
C++
1
2
3
for(std::list<int>::reverse_iterator it = lst.rbegin(); it != it.rend(); ++it) {
    std::cout << *it << std::endl;
}
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
08.07.2015, 13:34  [ТС]     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #7
Хотя сделал vector, там есть доступ к i-му элементу

Добавлено через 15 часов 5 минут
при выполнении
Result.push_back(*abcMy);
не происходит вызова конструктора, соответственно не создается копия объекта, почему?

Добавлено через 4 минуты
И вообще при повторном вызове test происходит следующее
первый вызов test
1) создание abcMy
2) помещение в Result
второй вызов тест
3)создание abcMy
4)на строке Result.push_back(*abcMy); вызов ДЕСТРУКТОРА???
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
08.07.2015, 13:36     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #8
Цитата Сообщение от klynxe Посмотреть сообщение
не происходит вызова конструктора, соответственно не создается копия объекта, почему?
вызывается сгенерированный конструктор копирования
C++
1
2
3
4
class ClassName {
public:
    ClassName(const ClassName&); // copy constructor
};
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 537
08.07.2015, 14:16  [ТС]     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #9
А почему деструктор вызывается?

Добавлено через 22 минуты
Цитата Сообщение от Cra3y Посмотреть сообщение
вызывается сгенерированный конструктор копирования
А он то по умолчанию неверно копирует мои
char **argv;
char **azColName;
Так, это понял, осталось понять почему вызывается деструктор только при втором вызове push_back?

И еще, при вызове test
1)создаю объект abc
2)вызываю push_back, создавая тем самым еще одну копию объекта abc

Можно обойтись одним объектом? То есть переместить мой или создать новый сразу в Result, без временного объекта?

Добавлено через 14 минут
Вызов
Result.push_back(std::move(*abcMy));
от вызова конструктора копирования не избавил(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 14:18     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?
Еще ссылки по теме:

Чему будет равно значение переменной z после выполнения следующего фрагмента программы? C++
Чему будет равна переменная после выполнения следующего фрагмента программы? C++
Что будет находится в переменных a и b после выполнения следующего фрагмента C++

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
08.07.2015, 14:18     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result? #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от klynxe Посмотреть сообщение
А почему деструктор вызывается?
без кода гадать сложно, но вроде все происходит в следующем порядке
  1. при передаче создается временная копия
  2. создается пустой объект в элементе вектора
  3. в этот пустой объект с помощью оператора присваивания копируется временный объект
  4. уничтожается временная копия
добавьте в конструкторы и деструктор вывод адреса объекта, тогда сможете увидеть что в каком порядке создается и уничтожается
Цитата Сообщение от klynxe Посмотреть сообщение
Можно обойтись одним объектом?
в стандарте C++11 у вектора и других контейнеров для этой цели добавлены функции emplace*(emplace_back, например)
Yandex
Объявления
08.07.2015, 14:18     После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?
Ответ Создать тему
Опции темы

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