powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / 2 раза вызывается деструктор
37 сообщений из 37, показаны все 2 страниц
2 раза вызывается деструктор
    #39632350
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги помогите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
struct test {

    test() {
        printf("created\n");
    }

    ~test() {
        printf("released\n");
    }
};

int main() {
    std::map<std::string, test> *aMap = new std::map<std::string, test>();
    std::string s{"aa"};
    test t{};
    aMap->emplace(s, t);
    aMap->clear();

    printf("finished\n");
}



Есть вот такой код
Результат - вот такая печать

created
released
finished
released

Подскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632366
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen, у тебя для каждого экземпляра test деструктор вызывается единожды - для экземпляра в map и для экземпляра на стеке (test t).
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632370
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как это

я же создаю 1 объект test t{}; и кладу его в мап
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632388
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenКак это

я же создаю 1 объект test t{}; и кладу его в мап

1) создаёшь экземпляр где?
2) глагол "кладу" - расшифруй для себя (можно глняуть отладчиком что происходит, только с заходом в саму мапу)

именно про это те и сказали выше.
(круглый)
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632392
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test t{};

Создаю на стеке

aMap->emplace(s, t);

Неужели конструктор копирования вызывается ?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632429
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт. И вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон.

Делай так:
Код: plaintext
1.
aMap->emplace(s, new test());
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632455
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я маленько наврал. :) Метод emplace принимает ссылки на rvalue:
Код: plaintext
1.
2.
emplace(_Args&&... __args)
{ return _M_t._M_emplace_unique(std::forward<_Args>(__args)...); }

Поэтому, надо делать что-то типа:
Код: plaintext
1.
aMap->emplace(s, test(<параметры_конструктора>));

В этом случае, на стеке будет создан временный экземпляр класса test, а при передаче в map будет задействован либо конструктор копии, либо конструктор пересылки, в зависимости от того, реализованы ли эти конструкторы для класса. Это то, о чем писалось в другой ветке - RVO/NRVO.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632462
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenКоллеги помогите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
struct test {

    test() {
        printf("created\n");
    }

    ~test() {
        printf("released\n");
    }
};

int main() {
    std::map<std::string, test> *aMap = new std::map<std::string, test>();
    std::string s{"aa"};
    test t{};
    aMap->emplace(s, t);
    aMap->clear();

    printf("finished\n");
}



Есть вот такой код
Результат - вот такая печать

created
released
finished
released

Подскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно

У тебя всё нормально с деструкторами.
У тебя ненормально с конструкторами. Ты не всех их "трассируешь".
У тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз.

http://en.cppreference.com/w/cpp/container/map/emplace
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632463
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.sementest t{};

Создаю на стеке

aMap->emplace(s, t);

Неужели конструктор копирования вызывается ?

Ну да, или он.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632466
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devsemen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт. И вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон.

Делай так:
Код: plaintext
1.
aMap->emplace(s, new test());



Ты хотел написать НЕ ДЕЛАЙ так ?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632468
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devsemen.s.semen, а как же?! Если ты явно не указал на отсутствие реализации конструктора копирования, он будет создан по умолчанию с реализацией простого копирования байт-в-байт.


Нет, implicit конструкторы копирования ничего не копируют байт-в байт.
Это -- расхожий среди новичков миф о С++.
Дефолтный конструктор копирования вызывает копирование предков, затем почленное копирование всех мемберов.
Никакого копирования байт-в байт не происходит никогда.

авторИ вообще - создавать на стеке экземпляры класса, а потом помещать их в map, созданный в куче - моветон.


Не выдумывай ерунду. Ты не на Java пишешь.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632489
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semen,

А зачем вообще map создавать в куче? Если уж создал, то и подчистить за собой надо.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632493
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, ненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно, а в регистре #CX - кол-во байт. Конечно, зависит от конкретной реализации компилятора.

Кстати, обращал внимание, как сейчас компиляторы помещают в стек параметры? Никаких тебе множественных PUSH! :) Сразу грузит в #SP значение с учётом смещения для всех параметров, формируя кадр стека и помещает туда параметры обычным MOV.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632494
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТы хотел написать НЕ ДЕЛАЙ так ?Я чуть ниже исправился. :)
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632495
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУ тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз.Конструктор пересылки, в отличие от конструктора копии, не создается по умолчанию - необходима явная реализация.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632528
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenПодскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <map>
#include <cstdio>
#include <memory>

struct test {

    test() {
        printf("created\n");
    }

    ~test() {
        printf("released\n");
    }
};

int main() {
    std::map<std::string, std::unique_ptr<test>> aMap;
    std::string s{"aa"};
    std::unique_ptr<test> t{new test()};
    aMap.emplace(s, std::move(t));
    aMap.clear();

    printf("finished\n");
};

Код: plaintext
1.
2.
created
released
finished
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632541
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadsemen.s.semenПодскажите как сделать так чтобы деструктор (released) не вызывался 2 раза - это же вроде как некорректно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <map>
#include <cstdio>
#include <memory>

struct test {

    test() {
        printf("created\n");
    }

    ~test() {
        printf("released\n");
    }
};

int main() {
    std::map<std::string, std::unique_ptr<test>> aMap;
    std::string s{"aa"};
    std::unique_ptr<test> t{new test()};
    aMap.emplace(s, std::move(t));
    aMap.clear();

    printf("finished\n");
};

Код: plaintext
1.
2.
created
released
finished


Интересно

А в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632561
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devMasterZiv, ненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно, а в регистре #CX - кол-во байт. Конечно, зависит от конкретной реализации компилятора.

Кстати, обращал внимание, как сейчас компиляторы помещают в стек параметры? Никаких тебе множественных PUSH! :) Сразу грузит в #SP значение с учётом смещения для всех параметров, формируя кадр стека и помещает туда параметры обычным MOV.

Почему ты выдумываешь всё время?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632564
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devMasterZivУ тебя в коде вызывается MOVE-конструктор, который ты не замечаешь, игнорируешь, а потом думаешь (неверно), что деструктор вызывается лишний раз.Конструктор пересылки, в отличие от конструктора копии, не создается по умолчанию - необходима явная реализация.

Опять фантазии?
Он В ДАННОМ КОНКРЕТНОМ случае не создаётся, потому что деструктор объявлен.
Да, это я прошляпил. Тогда должен использоваться конструктор копирования (который есть всегда если move не объявишь).
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632565
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632570
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?

std::move вообще ничего не делает.
Как он может создавать объект?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632574
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции.

Он просто ссылку преобразует в rvalue-ссылку, если это возможно.
И всё. А далее что-то либо копирует из rvalue-ссылки, либо перемещает. Как может.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632576
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632584
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadsemen.s.semenА в данном случае std::move(t) не приведет к вызову конструктора и созданию еще одного объекта ?Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту.

И зачем ты туда new всобачил?
Чтобы запутать ещё больше?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632585
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAmKadпропущено...
Нет. Происходит передача указателя на уже выделенный участог памяти. После передачи указателя ф-ия main им уже не владеет. Исключительные права передаются map-объекту.

И зачем ты туда new всобачил?
Чтобы запутать ещё больше?

Уважаемый Мастер Зив

Привидите пожалуйста Ваш корректно работающий вариант кода с использованием std::move
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632588
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivDima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции.

Он просто ссылку преобразует в rvalue-ссылку, если это возможно.Мне больше нравится, как сказано у самого Мейерса: std::move преобразует в rvalue (без "-ссылку").
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632593
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semen.s.semenПривидите пожалуйста Ваш корректно работающий вариант кода с использованием std::move
ИМХО лучше почитай об этом в книге Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14

Там понятным языком разжевано что такое std::move и что надо прописать в классе чтобы он работал. Читать немного, 10-20 страниц.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632599
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ зачем ты туда new всобачил?
Чтобы запутать ещё больше?Не понял вопроса.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632658
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции.Как еще должен "работать" обычный шаблон, как не во время компиляции? И причем тут, вообще, шаблон std::move?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632906
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно
НЕ НАДО так делать! В случае с копированием двух объектов одного класса может быт ещё ничего плохого не произойдёт, но в общем случае можно закосячить объект.

Во-первых, в объект входит указатель на виртуальную таблицу методов, если есть (это MS)
Во-вторых, если есть родительские методы, то &x и реальное начало данных x могут отличаться.
Плюс ещё оптимизатор, вроде, может чего-нить местами переставить.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39632971
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbВо-первых, в объект входит указатель на виртуальную таблицу методов, если есть (это MS)
Плюс ещё оптимизатор, вроде, может чего-нить местами переставить.Собственно, указатель this, это указатель на указатель на таблицу виртуальных методов - это еще в Borland TASM было.
CEMbВо-вторых, если есть родительские методы, то &x и реальное начало данных могут отличаться.Не может! У экземпляра класса есть лишь одна таблица виртуальных методов, которая хранится отдельно от экземпляра класса и все экземпляры одного и того же класса имеют один и тот же указатель на таблицу виртуальных методов. При наследовании, компилятор создает копию родительской таблицы виртуальных методов и добавляет в конец этой копии указатели на виртуальные методы наследника в порядке их объявления. Конец таблицы виртуальных методов определяется указателем NULL.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633478
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, ну, может на счёт второго я и напутал что-то, я не смог вспомнить пример. Но первого достаточно, чтобы не копировать память вручную. Это потенциальная ошибка, у тебя могут быть пара указателей на класс А, один из которых на самом деле указывает на дочерний класс В. В случае прямого копирования получится неправильный экземпляр.
Хотя, интересный хак получается :)
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633557
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbrdb_dev, ну, может на счёт второго я и напутал что-то, я не смог вспомнить пример. Но первого достаточно, чтобы не копировать память вручную. Это потенциальная ошибка, у тебя могут быть пара указателей на класс А, один из которых на самом деле указывает на дочерний класс В. В случае прямого копирования получится неправильный экземпляр.
Хотя, интересный хак получается :)Почему должен получится неправильный экземпляр? Давай рассмотрим простой пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class A
{
  a1 UINT64;
  a2 UINT32;

  A(const A & a)
  {
    size_t dataSz = (size_t)this->a2 + sizeof(A::a2) - (size_t)this->a1;
    ::memcpy(&this->a1, &a->a1, dataSz);
  };
}

class B : public A
{
  b1 UINT32;
  b2 UINT64;
}

int _cdecl main(int argc, char* argv[])
{
  auto b = new B();
  auto a = new A(*dynamic_cast<A>(b));
}

В соответствии с ABI, экземпляр B в памяти будет выглядеть следующим образом (на x86_32 при выравнивании на QWORD):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 +0: B::vtbl_ptr
 +4: align space
 +8: a1
+16: a2
+20: align space
+24: b1
+28: align space
+32: b2
+40: out of instance

Поэтому, конструктор копии экземпляра A скопирует именно ту часть, которую должен. Вообще, я предпочитаю объединять члены класса в структуру - так проще копировать, если нет необходимости делать копии того, на что указывают члены-указатели, а для конструктора пересылки это идеальный вариант.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633564
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно обсуждали что std::string нельзя просто скопировать для переноса.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633584
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, конечно, экземпляры чужих классов нехорошо просто копировать, особенно, если не знаешь как они устроены, это ежу понятно! Но создать реализацию конструктора пересылки своего класса, которая будет копировать данные байт-в-байт, а затем подчищать источник - вполне допустимо.
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633624
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devПочему должен получится неправильный экземпляр?потому что vtable pointer от одного класса перезапишется поверх vtp другого класса. Если использовать this-ы.

rdb_devДавай рассмотрим простой пример:а, ты какой хитрый!
ты берёшь адрес с переменной.
а это ещё хуже, потому что напишешь копировальщик. А потом забудешь, будешь рефакторить и перед a1 поставишь какую-нить другую переменную - и получится трудноуловимая ошибка.

Нет, я согласен, так делать можно при должной осторожности . Но я бы лично так не делал. Выгода не понятна, сомневаюсь в наличии таких классов, у которых movsb даст много выигрыша по сравнению с по-переменным копированием. Если в классе есть большие блоки данных (массивы, векторы), у них свой копировальщик. Все остальные копируются вручную.

Кстати, а что будет, если shared_ptr так скопировать? Т.е. понятно, что счётчик не увеличится, но что будет когда объект класса содержащего копию этого shared_ptr будет уничтожен?
...
Рейтинг: 0 / 0
2 раза вызывается деструктор
    #39633687
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbпотому что vtable pointer от одного класса перезапишется поверх vtp другого класса. Если использовать this-ы.Естественно, копировать указатель на таблицу виртуальных методов не стОит! Он и так нормально проинициализируется.
CEMbа, ты какой хитрый!
ты берёшь адрес с переменной.Конечно! Что же еще? 😊
CEMbа это ещё хуже, потому что напишешь копировальщик. А потом забудешь, будешь рефакторить и перед a1 поставишь какую-нить другую переменную - и получится трудноуловимая ошибка.Поэтому, я и написал, что предпочитаю засовывать всё мемберы в инкапсулируемую структуру. Её проще копировать и даже можно написать inline конструктор копии или конструктор пересылки такой структуры.
CEMbНет, я согласен, так делать можно при должной осторожности . Но я бы лично так не делал. Выгода не понятна, сомневаюсь в наличии таких классов, у которых movsb даст много выигрыша по сравнению с по-переменным копированием. Если в классе есть большие блоки данных (массивы, векторы), у них свой копировальщик. Все остальные копируются вручную.Представь, что у тебя не три и не четыре члена, размером не более размерности регистра платформы, которые компилятор может распихать в регистры EAX, EDX, ECX, EBX, а гораздо больше и, к примеру, все long long, а приложение 32-х разрядное. Я пихаю все члены в структуру, чтобы не пропустить в конструкторе копии или пересылки какой-нибудь член, а гарантировано всё скопировать. Для конструктора пересылки это вполне нормальный подход, так как после копирования можно просто заполнить структуру источника нолями, что позволит обнулить и указатели, чтобы деструктор не освободил данные, которыми уже владеет объект-приемник.
CEMbКстати, а что будет, если shared_ptr так скопировать? Т.е. понятно, что счётчик не увеличится, но что будет когда объект класса содержащего копию этого shared_ptr будет уничтожен?Не надо просто копировать shared_ptr - он на это не расчитан. Другое дело, если ты создаешь свой собственный класс safe-thread смарт-указателя и чтобы при возврате его как rvalue через стек не дёргать каждый раз переменную подсчёта ссылок в синглетоне через медленные атомарные операции работы с памятью, ты можешь написать конструктор пересылки, который будет лишь копировать данные из источника и обнулять источник. Но это при условии, что синглетон типа не содержит реализацию реферальных ссылок на смарт-указатели.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / 2 раза вызывается деструктор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]