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

Здравствуйте. вопрос имею за деструкторы и их безопасное использование в

методах класса.
class MyClass{
int* data;
public:
//c-tor's + some methods
~MyClass(){ operator delete(data);}
auto operator = (MyClass const& other)-> MyClass&
{
if(this != &other){

this->~MyClass();
new (this) MyClass(other);
}
return *this;
}
};
кроме опасности, что new бросит bad_alloc и "всё прапала" - объект уже будет изничтожен - чем ещё плохо такое действо?

25 ответов

6 просмотров

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

Сергей- Автор вопроса
Liber Azerate
Кроме того, что, откровенно говоря, это жутковатое...

Ну с первым постулатом согласен полностью) а второй можно подробнее?

Сергей
Ну с первым постулатом согласен полностью) а второ...

Что произойдёт при вызове new(this) MyClass(other);?

Сергей- Автор вопроса
Liber Azerate
Что произойдёт при вызове new(this) MyClass(other)...

А, то есть к-тор создаст объект и оператор нью тоже что-то подобное сотворит?

Сергей
А, то есть к-тор создаст объект и оператор нью тож...

Ладно, более наводящий вопрос: что за синтаксис new(smt) obj?

Сергей- Автор вопроса
Liber Azerate
Ладно, более наводящий вопрос: что за синтаксис ne...

placement new не выделяет память, а встраивает что-то уже существующее в заказанный нами участок памяти. (цитата)Я так понимаю, что по адресу smt будет размещен obj. Нет?

Сергей
placement new не выделяет память, а встраивает что...

Вызывается конструктор по этому адресу, в общем. А какой конструктор вызовется в таком случае?

Liber Azerate
Вызывается конструктор по этому адресу, в общем. А...

Тот, который подойдет по аргументам, которые передадут в placement new

Александр
Тот, который подойдет по аргументам, которые перед...

Ну для того человека вопрос же, хотя этот ответ не является подсказкой, но всё же

Сергей- Автор вопроса
Liber Azerate
Вызывается конструктор по этому адресу, в общем. А...

х.з. я предполагаю, что к-тор от other. нет? ( если что - код не мой, пытаюсб понять)

Сергей
х.з. я предполагаю, что к-тор от other. нет? ( есл...

Лаааадно... В общем, это будет копирующий конструктор, тебе бы подучить основы немного. И лучше не смотри на такой код

Сергей- Автор вопроса
Liber Azerate
Лаааадно... В общем, это будет копирующий конструк...

я не это написал? к-тор от other : MyClacc (Myclass const& other){......{ - вон он и вызовется. И что?

Сергей
я не это написал? к-тор от other : MyClacc (Myclas...

Там operator=, а если бы это был копирующий конструктор, то была бы бесконечная рекурсия

Сергей- Автор вопроса
Liber Azerate
Там operator=, а если бы это был копирующий констр...

так. еще раз можно? Вот если объявлен к-тор MyClacc (Myclass const& other){...} и вот так как приведено в коде для оператора = все реализовано - будет бесконечная рекурсия?

Сергей
так. еще раз можно? Вот если объявлен к-тор MyClac...

Нет. Сейчас там сгенерированный по умолчанию копирующий конструктор, он выполняет почленное компирование. В связи с этим там ошибка двойного владения, то есть указатель будет удалён два раза. Однако если бы это был не operator=, а сам копирующий конструктор, то тот вызов new привёл бы к бесконечной рекурсии

Сергей- Автор вопроса
Liber Azerate
Нет. Сейчас там сгенерированный по умолчанию копир...

спасибо. пойду читать ошибка двойного владения

Сергей
спасибо. пойду читать ошибка двойного владения

Вряд ли найдёшь. Это не совсем корректное название в данном случае, если быть точным... Двойное удаление уж тогда гугли

Liber Azerate
Там operator=, а если бы это был копирующий констр...

Каво? Есть пример такого кода, когда вызывая конструктор копирования, ты и вызываешь рекурсию?

Сергей- Автор вопроса
Liber Azerate
Вряд ли найдёшь. Это не совсем корректное название...

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

Zigzag Hax
Каво? Есть пример такого кода, когда вызывая конст...

Немного другой немного искуственный пример, но тем не менее: class X { public: X() = default; X(X& oth) { this->~X(); new(this) X{ oth }; } };

Сергей
откуда двойное удаление то? если бы я в методе (в ...

Ещё раз. Во-первых, после вызова деструктора ты не выделяешь снова память. Ты делаешь placement new, который вызывает конструктор по данному адресу. Во-вторых, конструктор от объекта такого же класса – это конструктор копирования. Здесь он не определён, а сгенерирован по-умолчанию.

Сергей- Автор вопроса

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
если загрузчик efi? если сама PML4 PDPT PDT PT лежит в неудобном для меня месте?
Vi Chapmann 🪙
8
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Читаю сейчас [нет, уже больше не читаю!] курсовую о Булгакове, написанную, похоже, с помощью ChatGPT. Это удивительный психоделический опыт. Текст в основном написан в стиле б...
✨ Uni [🌊 В отпуске]
1
Карта сайта