动态内存分配导致 SIGSEGV(信号:分段违规),尝试使用 malloc 和 free

Dynamic memory allocation causing SIGSEGV (Signal: segmentation violation), In attempt to work with malloc and free

提问人:D. Sikilai 提问时间:11/19/2020 最后编辑:D. Sikilai 更新时间:11/19/2020 访问量:132

问:

我正在用 c++20 (Mingw-w64 clion) 创建一个数学数据结构,由于它的容量和大小,我可以将其部分从内存卸载到存储,反之亦然。在学习如何使用内存时,我测试了一个特定的代码,据我所知它应该可以工作。但是该应用程序由于分段违规 (SIGSEGV) 而崩溃,我无法推断出原因。我真的很感激你的帮助。

//Utility
template<typename C, typename T>
std::basic_ostream<C, T> &
operator<<(std::basic_ostream<C, T> &_out, const logics::atomic_logic &_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 &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 &_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 &id) {
                std::cout << "Aha! creating: " << id << std::endl;
                this->id = id;
            }
    
            logic_sym(const logic_sym &orig)=delete;
    
        private:
            logic_id id;
        };
    
  • c++ malloc 新运算符 动态内存分配 static-memory-allocation

    评论

    1赞 bmargulies 11/19/2020
    请显示logic_sym的定义。
    0赞 D. Sikilai 11/19/2020
    @bmargulies我已经编辑了问题以包括logic_sym的定义。我能得到一些帮助吗?
    0赞 1201ProgramAlarm 11/19/2020
    不能与该类一起使用,因为它具有需要运行的构造函数。malloc
    0赞 D. Sikilai 11/19/2020
    @1201ProgramAlarm我使用 调用构造函数,但仍然有什么原因可以解释为什么工作正常?*pointer = logic_sym(26);test2()
    1赞 user4581301 11/19/2020
    永远不要低估 Undefined Behaviour 隐藏错误的技能。

    答:

    2赞 bmargulies 11/19/2020 #1

    您不能简单地将指针转换为指向 的指针。必须使用 placement new 运算符来初始化内存。void *logic_sym

    new(pointer) logic_sym(26)
    

    但是,你为什么要大惊小怪,而不仅仅是使用 and?mallocfreenewdelete

    评论

    0赞 D. Sikilai 11/19/2020
    我怀疑我以前听说过放置新操作员,请问有参考建议吗?
    1赞 user4581301 11/19/2020
    @D.Sikilai en.cppreference.com/w/cpp/language/new#Placement_new