Можно ли очистить содержимое карты без вызова деструкторов содержащих объектов? - PullRequest
1 голос
/ 13 марта 2012

У меня есть map, который я использую для быстрого доступа к некоторым элементам моей программы.Я хочу удалить некоторые из этих элементов из моего map (у меня есть ссылки на них в другом месте).Есть ли способ удалить эти элементы, не вызывая их деструкторы с помощью функций map 's clear() или erase()?

Ответы [ 5 ]

2 голосов
/ 13 марта 2012

Если вы назначаете указатели на объекты, сами объекты не будут уничтожены. Если сами объекты находятся на карте, они будут уничтожены.

2 голосов
/ 13 марта 2012

Используйте shared_ptr, вот для чего он. Если элементы хранятся «окончательно» где-то еще, рассмотрите возможность использовать слабый_птр на карте и shared_ptr для определения окончательного местоположения магазина.

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

1 голос
/ 13 марта 2012

номер

Если элементы хранятся по значению, сделать это невозможно. Если вам нужна эта возможность, подумайте о том, чтобы поместить их в интеллектуальные указатели (например, unique_ptr, позволяющий .release() удерживать указатель).

0 голосов
/ 13 марта 2012

Мы слышали, что у вас есть контейнер, в котором значения являются указателями.Я предполагаю, что ключи являются тривиальными типами, такими как целые числа, или, может быть, std :: strings.И вы говорите, что ваша программа "вылетает", когда вы вызываете map <> :: clear ().Это говорит о том, что до вызова clear () у вас было какое-то повреждение памяти, потому что я не вижу причин, по которым сбой при очистке простых типов значений может привести к сбою.

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

0 голосов
/ 13 марта 2012

Нет;единственный стандартный контейнер с методом splice() - std::list.Это означает, что вы можете перемещать узлы списка из одного списка в другой, но не отображать или устанавливать узлы.

...