The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.50"
Отправлено Ordu, 12-Фев-21 16:35 
> Ну и что там в расте есть такого, что нельзя на плюсах?

О, ты знаток плюсов, да? Я тут столкнулся с ними, и всё никак не пойму, как заставить деструктор отрабатывать правильно. Вот глянь, есть код:

class Test {
public:
    Test(std::string name) {
        std::cout << "Constructor called with name: " << name << std::endl;
        this->name = name;
    }
    ~Test() {
        std::cout << "Destructor called for " << this->name << std::endl;
    }
private:
    std::string name;
};
    
int main() {
    Test a = Test(std::string("first"));
    a = Test(std::string("second"));
    return 0;
}

Он при запуске выводит:

Constructor called with name: first
Constructor called with name: second
Destructor called for second
Destructor called for second

Два объекта типа Test создаётся, два объекта удаляется. Дважды вызывается конструктор и дважды деструктор. Но, если присмотреться, то деструктор вызывается не на объект, а на кусок памяти, который этот объект, так случилось, занимал в момент создания объекта. Содержимое куска изменилось при присваивании, и но C++ не заметил этого, и вместо того, чтобы вызвать деструктор, перед присвоением, отложил вызов до выхода из функции, а там уже поздно пить боржоми.

Как сделать так, чтобы деструктор вызывался бы для объекта, а не для куска памяти? Чтобы программа выводила бы такое:

Constructor called with name: first
Constructor called with name: second
Destructor called for first
Destructor called for second

?

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру