методах класса.
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 и "всё прапала" - объект уже будет изничтожен - чем ещё плохо такое действо?
Кроме того, что, откровенно говоря, это жутковатое дерьмецо и так писать не стоит, тут банально двойное владение
Ну с первым постулатом согласен полностью) а второй можно подробнее?
Что произойдёт при вызове new(this) MyClass(other);?
А, то есть к-тор создаст объект и оператор нью тоже что-то подобное сотворит?
Ладно, более наводящий вопрос: что за синтаксис new(smt) obj?
placement new не выделяет память, а встраивает что-то уже существующее в заказанный нами участок памяти. (цитата)Я так понимаю, что по адресу smt будет размещен obj. Нет?
Вызывается конструктор по этому адресу, в общем. А какой конструктор вызовется в таком случае?
Тот, который подойдет по аргументам, которые передадут в placement new
Ну для того человека вопрос же, хотя этот ответ не является подсказкой, но всё же
х.з. я предполагаю, что к-тор от other. нет? ( если что - код не мой, пытаюсб понять)
Понял, подумал это ты не знаешь :)
Лаааадно... В общем, это будет копирующий конструктор, тебе бы подучить основы немного. И лучше не смотри на такой код
я не это написал? к-тор от other : MyClacc (Myclass const& other){......{ - вон он и вызовется. И что?
Там operator=, а если бы это был копирующий конструктор, то была бы бесконечная рекурсия
так. еще раз можно? Вот если объявлен к-тор MyClacc (Myclass const& other){...} и вот так как приведено в коде для оператора = все реализовано - будет бесконечная рекурсия?
Нет. Сейчас там сгенерированный по умолчанию копирующий конструктор, он выполняет почленное компирование. В связи с этим там ошибка двойного владения, то есть указатель будет удалён два раза. Однако если бы это был не operator=, а сам копирующий конструктор, то тот вызов new привёл бы к бесконечной рекурсии
спасибо. пойду читать ошибка двойного владения
Вряд ли найдёшь. Это не совсем корректное название в данном случае, если быть точным... Двойное удаление уж тогда гугли
Каво? Есть пример такого кода, когда вызывая конструктор копирования, ты и вызываешь рекурсию?
откуда двойное удаление то? если бы я в методе (в данном случае операторе) после вызова деструктора снова не выделял память - да, было бы двойное удаление. Тут то оно каким образом?
Я же вроде бы только что объяснил...
Немного другой немного искуственный пример, но тем не менее: class X { public: X() = default; X(X& oth) { this->~X(); new(this) X{ oth }; } };
Зря быканул, пример быдлокода увидел
Ещё раз. Во-первых, после вызова деструктора ты не выделяешь снова память. Ты делаешь placement new, который вызывает конструктор по данному адресу. Во-вторых, конструктор от объекта такого же класса – это конструктор копирования. Здесь он не определён, а сгенерирован по-умолчанию.
вот. теперь понял. спасибо!
Обсуждают сегодня