170 похожих чатов

Class Bar { void foo(std::shared_ptr<Base> &) { ...

}
std::shared_ptr<Derived> m_derived{std::make_shared<Derived>()};
};

foo(std::static_pointer_cast<Base>(m_derived));

Могу ли я в таком случае полагаться на корректную работу метода? Скастованный к Base объект умрет в момент выполнения foo, хотя физически в памяти он останется (как Base часть от Derived класса, являющегося полем Bar). Поэтому все должно быть ок, никаких seg fault, верно?

15 ответов

4 просмотра

Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Что значит «умрет, но останется в памяти»?

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

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

Все хорошо будет, короче :)

Что то тут не все, это даже не компилится

Rvalue не может быть подан в метод требующий ссылку.

Konstantin- Автор вопроса
Maus Grau
Что то тут не все, это даже не компилится

Я псевдокод накидал, могу на онлайн компиляторе скинуть рабочий пример

Konstantin
Я псевдокод накидал, могу на онлайн компиляторе ск...

По этому примеру вообще ничего нельзя сказать это не компилируемый код - да, так писать нельзя. Это работать не будет. Нужен нормальный пример отражающий реальный вопрос.

а это вообще компилируется?

тут создается временный объект, а вы его передаете в функцию, принимающую lvalue reference. Если бы была const reference, то все было бы ок с методом foo, потому что временный объект привяжется к константной ссылке, которая продлит его время жизни на время foo

Konstantin- Автор вопроса
Maus Grau
Rvalue не может быть подан в метод требующий ссылк...

Кстати, да. Вопрос невалиден, у нас же не даст в lvalue ref подать rvalue, так что ситуация невозможна

Konstantin- Автор вопроса
Sergey Kaniskin
тут создается временный объект, а вы его передаете...

Да, уже понял, спасибо, чет я под вечер туплю

Konstantin- Автор вопроса
Sergey Kaniskin
в const lvalue ref можно, но всё будет ок

Да, там лайтайм продлится, это уже неинтересно)

Похожие вопросы

Обсуждают сегодня

Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Кстати а покупал кто-нибудь ЭЦП для подписи кода? А то у меня на некоторых компах и ОС иногда SmartScreen винды программу за вирус принимал. Если купить такую ЭЦП и подписыват...
Дмитрий Завгородний
15
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
10
Hello, good time everyone I use Firebase to implement push notification inside the Flutter application and it works, but I don't receive the notification when the application ...
Iman
1
тут по sql есть спецы надеюсь есть таблица большая и там поле DATETIME TTIMESTAMP NOT NULL выборки будут по дням и нужен индекс... какой из индексов будет менее напряжным и ме...
Slym
9
А кто-нибудь запихивал сборку перловых модулей/образов с perl приложениями в окружения без интернета (в специализированном CI/CD)? У меня сейчас есть ряд cpanfile, которые н...
Andrey Smirnov / 𝓪𝓵𝓵𝓽𝓮𝓻 /
14
какие есть варианты для чтения больших текстовых файлов кроме TBufferedFileStream?
zamtmn
12
Вместо import и library придется писать importlib?
The Bird of Hermes
19
бля хуево, я больше с некст месяца не тим лид) нашу команду поглощает более большая команда( У кого такой же кейс был)?)
Alibek Кulseitov 🇰🇿
9
вот что получается в интерпрететоре, работает и результаты выгляд разумными, но то как выглядит код мне не нравиться, а понять куда двигаться не очень могу, если кому не лень ...
Fedor
42
Карта сайта