2012-03-13 1 views
1

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

+2

Какую цель ставите перед собой? Что плохого в том, что вызвали деструкторы? –

+0

Я рассматриваю карту как показатель для моей большей программы. Когда мне больше не нужны элементы в этом индексе, я все равно нуждаюсь в них в других частях программы. – finiteloop

+1

Тогда вы должны использовать указатели какого-то типа в виде сопоставленного типа. –

ответ

2

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

+0

Я сопоставляю . Кажется, что Object * s уничтожается. – finiteloop

+1

Указатели на объект уничтожаются, а не объекты с указателем. Похоже, что что-то не так или смутно. –

+0

Добавляете ли вы 'std :: auto_ptr ' или какой-либо другой вид умной указатель? Если нет, деструктор заостренного объекта не следует называть (сам указатель, конечно, будет уничтожен). – tmpearce

1

No.

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

2

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

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

0

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

0

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

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

Смежные вопросы