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 ответов

19 просмотров

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

Сергей- Автор вопроса
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, который вызывает конструктор по данному адресу. Во-вторых, конструктор от объекта такого же класса – это конструктор копирования. Здесь он не определён, а сгенерирован по-умолчанию.

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта