Совместно используемые указатели рекурсивно удаляют рекурсивные структуры данных и переполняют стек

У меня есть несколько длинных связанных списков (у них есть до 20 000 пунктов). У них разные начала, но они могут в конечном итоге указывать на один и тот же узел с какого-то узла и далее. Я решил позволить такому связному списку расти вместе и делиться памятью между ними.

Вот почему я решил реализовать связанный список с общими указателями:

#include <memory>
struct SharedLinkedList {
    int someData;
    std::shared_ptr<SharedLinkedList> next;
};

Таким образом, все работает отлично. Связанные списки, которые больше не нужны, удаляются. Если они делят какую-то часть с другим связанным списком, удаляется только их необщедоступная часть.

Проблема возникает, когда собираются удалить более длинные связанные списки без общих частей. Удаление начинается с первого элемента. Это уменьшает количество ссылок на следующий элемент, который также может быть удален, и это повторяется до тех пор, пока стек не переполнится.

Вот пример кода, который создает длинный связанный список, а затем не удаляет его.

SharedLinkedList* beginningOfList;
SharedLinkedList* actualElement = new SharedLinkedList();
SharedLinkedList* nextElement;

beginningOfList = actualElement;
for (int i = 0; i < 1000; i++) { // 100 is OK, 1000 is KO
    nextElement = new SharedLinkedList();
    actualElement->next = std::shared_ptr<SharedLinkedList>(nextElement);
    actualElement = nextElement;
}
delete beginningOfList;

Я заранее благодарен за одно из следующего:

Объяснение shared_pointers и того, что мне не хватает. Как я могу их использовать? И можно ли это сделать с их помощью? Не является ли такое разделение памяти тем, для чего были изобретены указатели общего доступа?совет, как переопределить мой кодЭтот код будет использоваться для научных расчетов, которые будут выполняться на моем компьютере. Могу ли я как-то подправить, чтобы увеличить размер стека?

Обратите внимание, что этот вопрос не специфичен для C ++ 11. Мне все равно, какая реализация общих пуантах используется. Я даже реализовал свои собственные общие указатели. Это позволило мне иметь более длинные связанные списки, но также появилась рекурсия в деструкторах и переполнении стека. И я не понимаю, каким образом могут быть реализованы общие указатели без рекурсии в деструкторах.

РЕДАКТИРОВАТЬ:

Просто чтобы избежать путаницы: я хочу повторить, что целыми списками можно поделиться. Так что их можно назвать деревьями.

Вот пример:

list1 содержит: 1,2,3,4,5,6,7.

list2 содержит: 6,6,6,1,2,3,4,5,6,7

list3 содержит: 10,11,12,1,2,3,4,5,6,7

Я хочу представить это в 3 SharedLinkedList, который не тратит память, храня 1,2,3,4,5,6,7 несколько раз, но они указывают на одно и то же место. Вот почему подсчет ссылок необходим.

delete list3; предполагается удалить только ту часть, которая не является общей, то есть элементы 10,11,12.

Ответы на вопрос(2)

Ваш ответ на вопрос