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

21 просмотр

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта