Задать вопрос
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, вопрос исправил, привел конкретный код. А сам основной вопрос прямо перед кодом - почему с пакой ошибка 1010 и почему при импорте в пустой файл ошибка 2005
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Román Mirilaczvili, в итоге у меня система типа
    struct iterator {
      void* data;
    };
    vector<vector<iterator>> memory;

    Я пренебрег дефрагментацией (считая что память будет в основном только выделяться), я пренебрег полностью типами, так что невозможно определить что хранится внутри void*, только создатель должен это знать или функции знакомые с создателем (тип указывается как id), но это вполне достаточно (исключение - классы, любые, они должны быть в итоге уничтожены правильным деструктором, который является частью функции создателя/функции знакомой со создателем).
    Внутренний вектор хранит iteratorы с void* одного size_t (и инициализация идет последовательно, так что сначала инициализируются одни размеры, потом другие, так что это дает некоторые шансы избежать фрагментации при изменении размера с x на y и с y на х, где x > y. Плюс не нужно производить реалокацию, потому что оно заполняется относительно плотно. Также учитывая, что современные компьютеры имеют очень много памяти, фрагментация считается допустимой.
    Плюс у меня контекст создания памяти это ее создание еще до запуска скриптов, ее использующих. Дальнейшие действия с изменением ее объема будут крайне редки.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Спасибо за ответы и примеры. Это правильные решения. Но я выберу решение Wataru, потому что у меня не возможно отследить является ли shared_ptr единственным на экземпляр данных. Я создам небольшое кол-во классов, которые только они доступны для удаления.
    Проверь этот код. Где в нем утечка и почему в нем не должен вызываться деструктор?
    Предлагаю просто не утверждать того, в чем ты не убедился лично.
    - Евгений Шатунов
    Я не знаю как еще понимать комбинацию
    Деструктор — это функция-член, которая вызывается автоматически при выходе объекта из области действия или явно уничтожена вызовом delete
    от Майкрософт и
    member function may only be called with a pointer to a complete type
    от cppreference в случае деструктора для std::shared_ptr
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, как мне умные указатели помогут в структуре vector<shared_ptr<void>>? Ну может я не настолько хорошо понимаю разницу в утечке памяти и ресурса, но она есть. И то, что если я начну использовать такую конструкцию, не позволит мне избежать утечки.
    Вы мне предлагаете не то, и я поясняю почему это не то. Я говорю - shared_ptr не вызовет деструктор класса. Утечка есть, все плохо.
    У меня нет цели вообще выражать свое мнение по умным указателям, я спрашиваю конкретные способы.
    Если умные указатели могут привести функцию экземпляра (вызывающую деструктор себя) к shared_ptr, то так и скажите, пожалуйста! Это будет прекрасным решением этой проблемы.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, я не знаю что за незнакомые слова я тебе говорю.
    Вероятно слово "каст".
    (string*)ptr - это каст. Из void* в string*. Если использовать твою идею то это в каждом dll надо писать функцию с кучей кастов. Например
    switch(type):
    case 0:
      delete (int*)ptr;
      return true;
    default:
      return false;

    и в случае объявления указателя на класс из этого модуля - дать ему указатель на сам класс, тип класса (enum например), указатель на функцию с этим enum.
    но это очень много case, поэтому я спрашиваю, можно ли сделать без этого.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, Посмотрел - нельзя.
    void string_destructor(void* ptr)
    {
    delete (string*)ptr;
    }
    . В новом загруженном модуле не string, а class smclss и указатель smclss*. Это можно решить тем, что каст всех указателей идет в модуле, это означает писать кучу кастов в каждом модуле. По-другому нельзя?
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, variant - хорошее решение при известном числе типов, но опять же, число типов не известно в силу подключения новых модулей. Также я не уверен, что variant вообще позволяет вызывать деструкторы классов.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, да, если можно было бы вызвать деструктор по указателю - было бы шикарно, тогда бы void* имел бы void (*f)() в паре и вызывался бы деструктор, а потом free. НО!
    Существует два ограничения на использование деструкторов:
    Вы не можете взять его адрес.
    Производные классы не наследуют деструктор базового класса.

    Питон на самом деле хранит все типы, а нам презентует как неявно типизированную запись.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Евгений Шатунов,
    Функция-член может быть вызвана только с указателем на полный тип (обратите внимание, что std::unique_ptr может быть создан из необработанного указателя на неполный тип).
    .
    Unlike the std::shared_ptr constructors, std::make_shared does not allow a custom deleter
    .
    Он не сможет удалить класс, если ему дать void. А вот сделать free - да, но это все равно будет утечкой памяти, если указатели класса указывали не на участки выделенной памяти, которая контролируется синглтоном.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Проблема в том, что в этом векторе может быть указатель на все что угодно, можно лишь пометь общую информацию о содержимом указываемом (класс или нет и т.д.). Так что variant не подходит. Модули (dll) представляют свои классы, так что синглтон работающий с вектором с указателями их не знает, он может принять только самые общие вещи.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Указатель на деструктор и конструктор не допускаются...
    Я не понимаю почему, если по документации Майкрософт
    это функция-член
    ...

    У меня ситуация такая - модули внешние со своими классами и типами запрашивают место для указателя под свои экземпляры. Чтобы обеспечить высвобождение всех ресурсов при удаления вектора с указателями на разные классы, нужно вызвать деструктор класса, а затем free. Удаление может происходить по запросу кем-либо. Поэтому вектором руководит синглтон, который обеспечивает выдачу и высвобождение памяти. Он располагается в "ядре", которое не знает типы классов модулей (они в dll).
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Wataru, можно ли тогда заменить delete void* на вызов деструктора по указателю как void (*f), то есть хранить 2 указателя, и затем вызывать free?
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Wataru, определение
    void __CRTDECL operator delete(void* _Block, size_t _Size) noexcept;
    . Он берет только мой указатель, ничего более.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    delete принимает void* в _Block, откуда он берет деструктор и _Size при указании delete (someclass*)pointer?
  • Как получить указатель на функцию класса?

    @communistic_sistema Автор вопроса
    Почему тогда в случае
    virtual void execute(std::vector* argumentspointer, uint64_t* errorcodepointer, bool forced) = 0;
    у obj1
    void (obj1::*func)(std::vector<void*>* argumentspointer, uint64_t* errorcodepointer, bool forced) = obj1::execute;
    std::tread th(func, new std::vector<void*>() 0, 0);

    возникает
    error C2893: Сбой при специализации функции-шаблона "unknown-type std::invoke(_Callable &&,_Ty1 &&,_Types2 &&...) noexcept()"
    message : Со следующими аргументами шаблона:
    message : "_Callable=void (__cdecl functionfactory::basicfunction::* )(std::vector> *,uint64_t *,bool)"
    message : "_Ty1=std::vector> *"
    message : "_Types2={uint64_t *, bool}"
    error C2780: unknown-type std::invoke(_Callable &&) noexcept(): требует аргументов: 1, имеется: 4
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Griboks, нет. Сделать запись vector(float, double) верной, используя свой аллокатор. Вот ТЗ. БЕЗ variant, это описано в самом вопросе!
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Griboks, я просил ответ который соответствует всем требованиям. Ваш ответ приводит к фрагментации данных при их удалении, стек не походит я уже указал это - доступ случайный, вы просили ТЗ, поэтому были даны конкретные случаи (вектор, флоат, дабл, примеры фрагментации с типами int8/16/32_t, вектор как место, куда будет помещен аллокатор). Проблему я объяснил четко - мне нужно иметь память со случайным доступом не в теории, а в реальности, в ней не должна быть избыточность, в ней не должно быть медленных способов дефрагментации, в ней надо уметь хранить типы с разным size_t, причем перемешивая их в том числе (в результате неупорядоченного сохранения разных типов). Вы никак не ответили на мой вопрос. Даже на мое конкретное ТЗ с вектором, вектором как место для аллокатора, флоат и дабл. Ничего. Вообще.
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Griboks, вы просили конкретный код. С конкретным числом типов, с конкретными размерами. Не важно сколько типов и с каким размером будет создано и положено в вектор, если аллокатор способен работать с разными размерами. Я сказал, что решение проблемы У решит проблему Х, потому что мне нужны идеи для реализации (а в данном случае работа аллокатора через size_t). От вас я пока получил ответ: стек, который не поддерживает случайный доступ (а программа разве вся стек???), незначащие биты (от которых я просил меня избавить еще в вопросе), "задайте другой вопрос, а не этот".
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Griboks, создать аллокатор, который сделает запись vector(float, double) верным для с/с++
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Griboks, тз с аллокатором vector(float, double) не выполнено. Если бы оно было выполнено - это было бы решением вопроса