LINUX.ORG.RU

В каком порядке вызываются деструкторы объектов при разрушении кадра стека?

 ,


0

4

Вот есть код

#include <stdio.h>

struct A{
	int x;
	~A(){ printf("%d\n", x); }
};

int main(int argc, const char **argv){
	A a1; a1.x = 1;
	A a2; a2.x = 2;
	return 0;
}
Всегда ли будет вывод
2
1
это гарантируется стандартом?

★★★★★
struct A{
	int x;
	~A(){ printf("%d\n", x); }
};

Никогда не понимал зачем так делать. Есть же классы.

Всегда ли будет вывод

А зачем тебе это может пригодиться?

matrixd
()
Ответ на: комментарий от matrixd

struct A

Есть же классы.

Марш обратно в школу, и в Development не возвращайся.

упорядоченность разрушения локальных переменных

А зачем тебе это может пригодиться?

Лол.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

В порядке, обратном их созданию, почти везде в C++. Единственное исключение, которое я знаю, — это порядок разрушения объектов в контейнерах, это нигде в стандарте не прописано и по факту отличается в различных реализациях. Т.е. у тебя в векторе объекты могут создаваться и разрушаться в одном и том же порядке, например, от начала к концу. Ни разу, правда, не видел, чтобы это приводило к каким-либо проблемам.

Gvidon ★★★★
()
Ответ на: комментарий от intelfx

Марш обратно в школу, и в Development не возвращайся.

Ты тоже уже «модератор девелопмента»? :) Такой совет можно и на первый вопрос дать. Отослать в RTFM, на этот твой стаковерфлоу, в стандарт, «и к пророку его». Нужно ли? Включил бы кэпа — и человек просветился, и ты ЧСВ погрел, но не деструктивно :)

slackwarrior ★★★★★
()
Ответ на: комментарий от intelfx

Марш обратно в школу, и в Development не возвращайся.

А что не так? Вот правда, объясни, где это полезно и зачем?

Лол.

А тут что не так? Мне как программисту (если байтоеблей не заниматься) какая разница в какой последовательности разрушаются переменные в локальной зоне видимости? Что я делаю не так если до сих пор ни разу не наткнулся на какие-либо проблемы с этим?

matrixd
()
Ответ на: комментарий от matrixd

А тут что не так? Мне как программисту (если байтоеблей не заниматься) какая разница в какой последовательности разрушаются переменные в локальной зоне видимости? Что я делаю не так если до сих пор ни разу не наткнулся на какие-либо проблемы с этим?

Хотя ладно. Это я понял. Сам придумал для себя пример где можно с этим столкнуться.

matrixd
()
Ответ на: комментарий от Gvidon

Блин, про контейнеры я тоже не думал;-)

В сложной структуре данных может выстрелить как то, если объекты контейнера относятся к разным ярусам граф зависимостей. Но это косяк проектирования.

AIv ★★★★★
() автор топика
Ответ на: комментарий от matrixd

Вам тонко намекнули что в плюсах struct и class это одно и то же, с точностью до прав доступа по умолчанию.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Можно разделить методы и члены класса^W структуры по зонам видимости? А как там дела с наследованием и виртуальными методами(никогда не обмазывался этим в структурах)?

И вот зачем использовать struct если есть class?

matrixd
()
Ответ на: комментарий от matrixd

Можно разделить методы и члены класса^W структуры по зонам видимости? А как там дела с наследованием и виртуальными методами(никогда не обмазывался этим в структурах)?

Всё есть.

И вот зачем использовать struct если есть class?

Чтобы не заморачиваться контролем доступа.

P.S. фраза «никогда не понимал» подразумевает некоторый опыт.

tailgunner ★★★★★
()
Ответ на: комментарий от matrixd

Можно разделить методы и члены класса^W структуры по зонам видимости? А как там дела с наследованием и виртуальными методами(никогда не обмазывался этим в структурах)?

Это СОВЕРШЕННО одно и то же. Разница лишь одна. В классах по-умолчанию private, в структурах sturct.

Dudraug ★★★★★
()
Ответ на: комментарий от matrixd

Мне как программисту (если байтоеблей не заниматься) какая разница в какой последовательности разрушаются переменные в локальной зоне видимости?

Вы с шаблонами проектирования вообще знакомы? Про SOLID читали? Там довольна большая часть подразумевает наличие в классе ссылки на некий интерфейс, а реальный объект конкретного класса мы подаем через конструктор/некий метод. В таком случае хотелось бы что бы сначала был уничтожен объект использюущий объект, а потом сам объект.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Это СОВЕРШЕННО одно и то же. Разница лишь одна. В классах по-умолчанию private, в структурах sturct.

Есть минимум еще одна разница. В Visual C++, например, для структур и классов используется разный префикс при манглинге.

anonymous
()
Ответ на: комментарий от anonymous

Ты сканфом-то парсить уже отучился, гуру?

А что не так со scanf? Понятно, что не с++ way, но я тоже считаю, что для форматного вывода (а может и ввода) printf удобнее потоков с++.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Тем, что может вылезти боком, например и не type-safe, что означает, что внезапно в int может записаться float или наоборот. И потом будешь искать, почему у тебя результат вычислений какой-то не такой.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от Dudraug

Наследование у структур ещё public по умолчанию.

mix_mix ★★★★★
()
Ответ на: комментарий от matrixd

Во-первых, вот потому и иди в школу, что любые слова любых икспердов не следует тупо принимать за абсолютную истину. Форматированный ввод через iostream затруднителен до состояния неюзабельности.

Во-вторых, вся приведённая статья наезжает на конкретно scanf() и спецификатор %s, с чем я полностью согласен (и я никогда не советовал ими пользоваться). В том треде, про который говорит аноним, я предлагал то ли fgets+sscanf, то ли %m[^\n].

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от invy

Дело вкуса.

Спасибо так понятнее. Просто мне еще пока не попадались примеры кода с использованием структур вместо классов (хоть камнями меня закидайте, но как по мне структура это тупо контейнер с публичными полями, а то что в крестах туда можно прикрутить методы - ну и ладно (указатели на функции в сях как поле структуры не берем)).

matrixd
()
Ответ на: комментарий от matrixd

Просто мне еще пока не попадались примеры кода с использованием структур вместо классов

То, что ты не писал ничего сложнее хелловорлда, тебя нисколько не оправдывает.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Во-первых, вот потому и иди в школу, что любые слова любых икспердов не следует тупо принимать за абсолютную истину. Форматированный ввод через iostream затруднителен до состояния неюзабельности.

Не всегда есть время и желание проверять все на своей заднице. Я думал процесс обучение это и есть принимать некоторые слова за истины. Вся учеба в универе только на этом и строится. Раз в учебнике написано - правда.

Во-вторых, вся приведённая статья наезжает на конкретно scanf() и спецификатор %s, с чем я полностью согласен и никогда не советовал ими пользоваться. В том треде, про который говорит аноним, я предлагал то ли fgets+sscanf, то ли %m[^\n].

Я не экстрасенс, он про сканф писал.

Ты сканфом-то парсить уже отучился, гуру?

matrixd
()
Ответ на: комментарий от intelfx

То, что ты не писал ничего сложнее хелловорлда, тебя нисколько не оправдывает.

Писал. Но причем тут это? Или все тру плюсовики забивают на ограничение доступа к переменным и вместо православных геттеров/сеттеров заворачивают все поля класса в структуру?

matrixd
()
Ответ на: комментарий от matrixd

Вся учеба в универе только на этом и строится.

Раз так, это очень, очень плохой универ. А вообще почитай стандарт как-нибудь.

mix_mix ★★★★★
()
Ответ на: комментарий от invy

Тем, что может вылезти боком, например и не type-safe, что означает, что внезапно в int может записаться float или наоборот. И потом будешь искать, почему у тебя результат вычислений какой-то не такой.

gcc предупреждеат об этом с -Wall.

anonymous
()
Ответ на: комментарий от matrixd

Т.е. извините используют структуру вместо класса.

matrixd
()
Ответ на: комментарий от matrixd

Не все. Но, тем не менее, да.

Опять же, очень забавно то, как ты восславляешь какой-то один паттерн (которому, видимо, тебя учили) и как бы презрительно смотришь на всё остальное.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Опять же, очень забавно то, как ты восславляешь какой-то один паттерн (которому, видимо, тебя учили) и как бы презрительно смотришь на всё остальное.

Я его из кутишных исходников почерпнул и на stackoverflow не однократно видел. Ну «все остальное» в данном случаи мне просто не понятно. Я на это не презрительно смотрю, а с глубоким непониманием(мотивации) и опаской. Т.е. просто не знаю ответа на вопрос «зачем так делают».

struct не имеет уровней видимости, все public. Его используют мудаки, которые хотят struct A вместо class A { public:

Дело вкуса.

Самые адекватные объяснения.

А вот почему ты на меня весь тред кидаешься вместо того чтобы просто ответить на вопрос - не ясно.

matrixd
()
Ответ на: комментарий от matrixd

хоть камнями меня закидайте, но как по мне структура это тупо контейнер с публичными полями

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

DarkEld3r ★★★★★
()
Ответ на: комментарий от matrixd

Или все тру плюсовики забивают на ограничение доступа к переменным и вместо православных геттеров/сеттеров заворачивают все поля класса в структуру?

В деталях имплементации, завернутых в непрозрачную пимпу, которыми ты таким образом не светишь наружу, это не важно. От слова совсем :) А если структурка используется как обертка для пачки параметров, которые лень по отдельности набирать в списке параметров метода, — «ограничение доступа к переменным» бессмысленно, как пафос про «православность» и прочие религиозные аргументы. Что не мешает ту же структурку возвращать/наполнять через геттер :)

slackwarrior ★★★★★
()
Ответ на: комментарий от matrixd

В C++ классы и структуры это одно и то же. Разница лишь в видимости по умолчанию. В структуре по умолчанию всё public, в классе - private.

Искренне ваш, К.О.

PS

RTFM

peregrine ★★★★★
()
Ответ на: комментарий от slackwarrior

Отрабатываю своё прозвище поттерингофанбоя, десу.

intelfx ★★★★★
()
Ответ на: комментарий от vertexua

Для совместимости с Си (aka plain old data) использовать ключевое слово struct необязательно — достаточно не иметь не-публичных нестатических полей (плюс остальные требования).

intelfx ★★★★★
()
Ответ на: комментарий от peregrine

В C++ классы и структуры это одно и то же.

Ладно, уговорил. А тебе не кажется что пользоваться для описания классов и классами и структурами это слишком жирно? Предлогаю тебе не использовать классы. Ведь одно и то же.

RTFM

ресурс от мелкомягких - илитарно

matrixd
()
Ответ на: комментарий от matrixd

А тебе не кажется что пользоваться для описания классов и классами и структурами это слишком жирно

Нет, не кажется. Во-первых, совместимость с сишкой, во-вторых, когда тебе надо больше private, то объявив класс, меньше буковок внутри писать.

ресурс от мелкомягких - илитарно

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

peregrine ★★★★★
()
Ответ на: комментарий от intelfx

Какой-то ты злой сегодня. Ну сморозил человек несуразицу по незнанию, подумаешь

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.