Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2012, 12:09   #1
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
По умолчанию Коварный С++. Что происходит?!

Объясните пожалуйсто почему программа выводит не "Destructor NULL" а "Destructor one". Ведь по идеи локальный объект вызывает деструктор и соответственно объект в векторе должен изменится так как это сылка на локальный объект.

Код:
#include<iostream>
#include<vector>
using namespace std;

struct S
{
	S(char* stroka) : c(stroka){}
	~S()
	{
		cout<< "Destructor \n";
		c = "NULL"; 
	}
	char* c;
};


int main()
{
	vector<S> massivS;
	massivS.push_back(S("one")); // S("one") локальный объект
	cout<< massivS[0].c <<'\n';   // massivS[0] сылка на локальный объект

	system("pause");
}
Начавший вне форума Ответить с цитированием
Старый 06.12.2012, 12:20   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) А знаете, можно использовать шрифт ещё крупнее.
2) При вызове push_back создаётся локальная копия переданного аргумента S("one"). Она, в свою очередь, копируется во внутреннюю структуру вектора, после чего вызов push_back завершается и она дохнет, выводя "Destructor". Перед смертью она успела изменить своё значение c, но об этом никто и никогда не узнает.
После этого Вы обращаетесь к копии, которую положили в вектор - в ней c по-прежнему указывает на строку "one".
Abstraction вне форума Ответить с цитированием
Старый 07.12.2012, 12:15   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include<iostream>
#include<vector>
using namespace std;

struct S
{
	S(char* stroka) : c(stroka){}
	~S()
	{
		cout<< "Destructor \n";
		c = "NULL"; 
	}
	char* c;
};


int main()
{
	vector<S> massivS;
	massivS.push_back(S("one")); // S("one") локальный объект
	cout<< massivS[0].c <<'\n';   // <--- внимательно смотрим сюда

	system("pause");
}
Ты ошибаешься, если думаешь, что вектор содержит ссылку на временный объект.
Вектор содержит копию временного объекта. Сам временный объект сдохнет сразу же, как только завершится операция, в которой он фигурирует.

Код:
int main()
{
	vector<S> massivS;
	massivS.push_back(S("one"));// <--в вектор попала копия объекта. По окончании операции временный объект сдохнет

	cout<< massivS[0].c <<'\n';   // вывод в консоль данных о копии, которая была создана внутри вектора.

	system("pause");
}
_Bers вне форума Ответить с цитированием
Старый 07.12.2012, 14:36   #4
Начавший
Пользователь
 
Аватар для Начавший
 
Регистрация: 29.08.2011
Сообщений: 14
По умолчанию

Abstraction и _Bers спасибо, уверен что я вас правильно понял. Для эксперимента дополнил структуру вот этими строками
Код:
private:
	S(S&){}
И всё, прощай vector
Начавший вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что происходит с сайтами? Smitt&Wesson Свободное общение 14 14.03.2012 11:11
что происходит в моем компе?! majestic2000 Безопасность, Шифрование 8 22.10.2011 10:35
Что происходит во время Win+D? Altera Общие вопросы Delphi 13 15.12.2009 05:16
Что происходит с локальным сервером??? just me PHP 13 14.04.2009 14:01