Динамическое выделение памяти, вызывающее SIGSEGV (сигнал: нарушение сегментации), при попытке работать с malloc и free

#c #malloc #new-operator #dynamic-memory-allocation #static-memory-allocation

#c #malloc #new-operator #динамическое выделение памяти #статическое выделение памяти

Вопрос:

Я создаю математическую структуру данных на c 20 (Mingw-w64 clion), которую я могу частично выгружать из памяти в хранилище и наоборот, из-за ее емкости и размера. Изучая, как я могу работать с памятью, я протестировал конкретный код, который, насколько мне известно, должен работать. Но приложение вылетает из-за нарушения сегментации (SIGSEGV), и я не мог понять, почему это так. Я был бы очень признателен за вашу помощь.

 //Utility
template<typename C, typename T>
std::basic_ostream<C, T> amp;
operator<<(std::basic_ostream<C, T> amp;_out, const logics::atomic_logic amp;_s) {
    _out << _s.to_string();
    return _out;
}
  

  • Следующее не работает.

     int main() {
        using namespace std;
        using namespace logics;
        auto *pointer = (logic_sym *) malloc(sizeof(logic_sym));
        *pointer = logic_sym(26);
        std::cout << (*pointer) << std::endl;
        free(pointer);
        return 0;
    }
      

    тем не менее, остальные ниже работают.

    этот:-

     int test2() {
        using namespace std;
        using namespace logics;
        auto *pointer = (logic_sym *) malloc(sizeof(logic_sym));
        *pointer = logic_sym(26);
        string s=pointer->to_string();
        std::cout << s<< std::endl;
        free(pointer);
        return 0;
    }
      

    и это:-

     int test3() {
        using namespace std;
        using namespace logics;
        auto *pointer = new logic_sym(26u);
        *pointer = logic_sym(26u);
        std::cout << *pointer << std::endl;
        free(pointer);
        return 0;
    }
      

    Редактировать
    atomic_logic не совсем важен, но ниже приведен logic_sym .

     
        struct logic_sym  final : public atomic_logic {
            [[nodiscard]] constexpr bool cached() const override {
                return false;
            };
    
            [[nodiscard]] const logic_id amp;get_id() const override {
                return id;
            }
    
            [[nodiscard]] constexpr logic_type get_type() const override {
                return logic_type::sym_t;
            }
    
            constexpr int operator<=>(const logic_id amp;_id) const override {
                return id - _id;
            }
    
            [[nodiscard]] std::string to_string() const override {
                if (id > 26)
                    return (std::string("p")   std::to_string(id));
                return (std::string()   ((char) (id   'a' - 1)));
            }
    
            [[maybe_unused]] explicit logic_sym(const logic_id amp;id) {
                std::cout << "Aha! creating: " << id << std::endl;
                this->id = id;
            }
    
            logic_sym(const logic_sym amp;orig)=delete;
    
        private:
            logic_id id;
        };
      
  • Комментарии:

    1. Покажите определение logic_sym, пожалуйста.

    2. @bmargulies я отредактировал вопрос, чтобы включить определение logic_sym. могу ли я получить некоторую помощь, пожалуйста.

    3. Вы не можете использовать malloc этот класс, потому что у него есть конструктор, который необходимо запустить.

    4. @1201ProgramAlarm я вызвал конструктор, используя *pointer = logic_sym(26); , и все же, что могло быть причиной того, почему test2() все работало нормально ?.

    5. Никогда не стоит недооценивать умение Undefined Behavior скрывать ошибки.

    Ответ №1:

    Вы не можете просто привести void * указатель к указателю на logic_sym . Для инициализации памяти необходимо использовать оператор размещения new .

     new(pointer) logic_sym(26)
      

    Однако, почему вы суетитесь с malloc and free вместо того, чтобы просто использовать new and delete ? `

    Комментарии:

    1. Я сомневаюсь, что я слышал о размещении нового оператора раньше, есть ли справочная рекомендация, пожалуйста?

    2. @D.Sikilai en.cppreference.com/w/cpp/language/new#Placement_new