C++ 动态内存分配导致SIGSEGV(信号:分段冲突),试图使用malloc和free

C++ 动态内存分配导致SIGSEGV(信号:分段冲突),试图使用malloc和free,c++,malloc,new-operator,dynamic-memory-allocation,static-memory-allocation,C++,Malloc,New Operator,Dynamic Memory Allocation,Static Memory Allocation,我正在用c++20(Mingw-w64 clion)创建一个数学数据结构,由于它的容量和大小,我可以部分地从内存卸载到存储,反之亦然。在学习如何使用内存时,我测试了一个据我所知应该可以使用的特定代码。但由于分段冲突(SIGSEGV),应用程序崩溃,我无法推断原因。我非常感谢你的帮助 //实用程序 样板 std::基本_ostream& 运算符您不能简单地将void*指针强制转换为指向logic\u sym的指针。必须使用placement new运算符来初始化内存 new(pointer) lo

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

//实用程序
样板
std::基本_ostream&

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

new(pointer) logic_sym(26)

然而,你为什么要忙于
malloc
free
而不是仅仅使用
new
delete
?`

请显示逻辑符号的定义。@b我已经编辑了这个问题,以包括逻辑符号的定义。我能得到一些帮助吗。你不能对那个类使用
malloc
,因为它有一个需要运行的构造函数。@1201程序我用
*pointer=logic\u sym(26)调用了这个构造函数,还有什么原因可以解释为什么
test2()
工作得很好?。千万不要低估他隐藏错误的技能。我怀疑我以前听说过新操作员的位置。请提供参考建议?@D.Sikilai

    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;
    };
new(pointer) logic_sym(26)