struct iterator {
void* data;
};
vector<vector<iterator>> memory;
Проверь этот код. Где в нем утечка и почему в нем не должен вызываться деструктор?- Евгений Шатунов
Предлагаю просто не утверждать того, в чем ты не убедился лично.
Деструктор — это функция-член, которая вызывается автоматически при выходе объекта из области действия или явно уничтожена вызовом deleteот Майкрософт и
member function may only be called with a pointer to a complete typeот cppreference в случае деструктора для std::shared_ptr
vector<shared_ptr<void>>
? Ну может я не настолько хорошо понимаю разницу в утечке памяти и ресурса, но она есть. И то, что если я начну использовать такую конструкцию, не позволит мне избежать утечки.(string*)ptr
- это каст. Из void* в string*. Если использовать твою идею то это в каждом dll надо писать функцию с кучей кастов. Напримерswitch(type):
case 0:
delete (int*)ptr;
return true;
default:
return false;
void string_destructor(void* ptr)
{
delete (string*)ptr;
}
. В новом загруженном модуле не string, а class smclss и указатель smclss*. Это можно решить тем, что каст всех указателей идет в модуле, это означает писать кучу кастов в каждом модуле. По-другому нельзя? Существует два ограничения на использование деструкторов:
Вы не можете взять его адрес.
Производные классы не наследуют деструктор базового класса.
Функция-член может быть вызвана только с указателем на полный тип (обратите внимание, что std::unique_ptr может быть создан из необработанного указателя на неполный тип)..
Unlike the std::shared_ptr constructors, std::make_shared does not allow a custom deleter.
это функция-член...
void __CRTDECL operator delete(void* _Block, size_t _Size) noexcept;
. Он берет только мой указатель, ничего более. void (obj1::*func)(std::vector<void*>* argumentspointer, uint64_t* errorcodepointer, bool forced) = obj1::execute;
std::tread th(func, new std::vector<void*>() 0, 0);