动态内存分配导致 SIGSEGV(信号:分段违规),试图使用 malloc 和 free
Dynamic memory allocation causing SIGSEGV (Signal: segmentation violation), In attempt to work with malloc and free
我正在用 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;
};
您不能简单地将 void *
指针转换为指向 logic_sym
的指针。您必须使用放置新运算符来初始化内存。
new(pointer) logic_sym(26)
但是,你为什么要用 malloc
和 free
而不是只使用 new
和 delete
?`
我正在用 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;
};
您不能简单地将 void *
指针转换为指向 logic_sym
的指针。您必须使用放置新运算符来初始化内存。
new(pointer) logic_sym(26)
但是,你为什么要用 malloc
和 free
而不是只使用 new
和 delete
?`