Size: a a a

2021 February 23

s

std::slavik in supapro.cxx
но нам в любом случае надо договориться - каким числом мы будем помечать указатель который ни на что не указывает
источник

s

std::slavik in supapro.cxx
чтобы мы могли в рантайме, например, понять что память очищена
источник

s

std::slavik in supapro.cxx
так что какой-то из адресов придется под это отдать и договориться не использовать
источник

MK

Mikhail Kalugin in supapro.cxx
std::slavik
но нам в любом случае надо договориться - каким числом мы будем помечать указатель который ни на что не указывает
Вообще, не обязательно - но так проще, возможность быть «нулем» (точнее невалидным) главное отличие указателя от ссылки.
источник

s

std::slavik in supapro.cxx
сколько там адресов у какой платформы мы не знаем, но у всех есть нулевой
источник

s

std::slavik in supapro.cxx
Mikhail Kalugin
Вообще, не обязательно - но так проще, возможность быть «нулем» (точнее невалидным) главное отличие указателя от ссылки.
ну как не обязательно - мы выделили переменную какую-то, которая содержит адрес по которому мы должны перейти чтобы попасть на объект
источник

s

std::slavik in supapro.cxx
как мы можем по значению этой переменной понять - это валидный адрес или нет
источник

s

std::slavik in supapro.cxx
мы должны договориться что если значение вот такое - например 0 - тогда считаем что не валидный
и не переходим
источник

MK

Mikhail Kalugin in supapro.cxx
std::slavik
ну как не обязательно - мы выделили переменную какую-то, которая содержит адрес по которому мы должны перейти чтобы попасть на объект
Хранить где-то. Проще всего в ней самой, но можно (хотя и не надежно) и отдельно.
источник

s

std::slavik in supapro.cxx
Mikhail Kalugin
Хранить где-то. Проще всего в ней самой, но можно (хотя и не надежно) и отдельно.
ну окей - отдельно, тогда нам нужно вдовесок к адресу самому еще выделять машинное слово под флаг
источник

s

std::slavik in supapro.cxx
и мы получается увеличиваем размер указателей всех
источник

s

std::slavik in supapro.cxx
и усложняем работу с ними
источник

ID

In Dev in supapro.cxx
dmbldr
Он не доходит до туда. Вылетает, когда происходит копирование графа в impl_fill
А в графе еще что-нибудь лежит?
источник

MK

Mikhail Kalugin in supapro.cxx
std::slavik
и усложняем работу с ними
Да, и единственным плюсом будет возможность пользоваться нулевым адресом - в 99% случаев оно того не стоит.
источник

s

std::slavik in supapro.cxx
вместо того чтобы перейти сразу по адресу если он не 0 - мы сперва переходим по адресу где флаг хранится, если этот флаг не 0 - тогда переходим по адресу который рядом с флагом
ну типа звучит даже коряво
источник

d

dmbldr in supapro.cxx
In Dev
А в графе еще что-нибудь лежит?
Нет.
источник

ID

In Dev in supapro.cxx
dmbldr
Нет.
Значит падает где-то в другом месте. При копировании графа никакого free не будет в вашем примере
источник

ID

In Dev in supapro.cxx
Т.е. падает не "при копировании графа в impl_fill"
источник

s

std::slavik in supapro.cxx
dmbldr
Переслано от dmbldr
Подскажите, откуда тут берётся ошибка double free or corruption (out).

Основной код:
class brute_force {
public:
void impl_fill(graph g) {
   if(all_subgraphs.find(g) == all_subgraphs.end()) {
       if(g.is_reachable(_s, _d)) {
           all_subgraphs.insert(g);
           for(size_t i = 0; i < g.num_edges(); ++i) {
               g.erase_edge(i);
               impl_fill(g);
           }
       }
   }
}

void fill_set() {
   impl_fill(_g); <--вот тут вылетает
}
private:
   graph _g;
   std::unordered_set<graph, graph_hash> all_subgraphs;
};
Код класса `graph`:
class graph {
public:
   using byte = unsigned char;
   using edge_type = std::vector<std::pair<byte, byte>>;

   graph() = default;
   graph(graph const& other) = default;

   graph(edge_type edges, byte n) : edges(std::move(edges)), n(n) {};

private:
   edge_type edges;
   byte n = 0;
};
ну типа рекурсия - опасносте
источник

s

std::slavik in supapro.cxx
последний узел скорей всего 2 раза удаляется
источник