#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