Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.71
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Хранение указателей в контейнерах - C++

11.09.2010, 14:28. Просмотров 2205. Ответов 27
Метки нет (Все метки)

Я тут на форуме читал мнение,что хранение указателей в контейнерах - это плохо. Все,кто так думает,не могли бы вы обосновать данное утверждение с точки зрения C++ программирования?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2010, 14:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранение указателей в контейнерах (C++):

Хранение указателей в DLL - C++
Доброго времени суток, уважаемые знатоки! Суть вопроса: создаю в MS VS 2012 (С++) динамическую библиотеку, в ней хранятся описания...

Стандартные функции поиска элементов в контейнерах - C++
Какие есть стандартные библиотеки/ф-ции поиска в с++? Нашел find(), но не совсем понятна его работа. Как я понял, он возвращает итератор на...

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей - C++
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей. Вернуть адрес...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) - C++
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе указателя на int нужна звёздочка (*), а...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
niXman
Эксперт C++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 14:39 #2
а что тут обосновывать? не RAII это, потому и зло.
2
fasked
Эксперт С++
4937 / 2517 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.09.2010, 21:02 #3
copy-and-swap
0
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
11.09.2010, 21:39 #4
Цитата Сообщение от #pragma Посмотреть сообщение
Я тут на форуме читал мнение,что хранение указателей в контейнерах - это плохо. Все,кто так думает,не могли бы вы обосновать данное утверждение с точки зрения C++ программирования?
Можешь задействовать специальные контейнеры для указателей, если тебя волнует автоматическое удаление объектов в деструкторе контейнера: http://www.boost.org/doc/libs/1_44_0...container.html

Однако, если ты даже обернешь стандартный контейнер с указателями в свой класс, в деструкторе которого ты будешь удалять указатели, то с точки зрения RAII тоже будет все нормально.
1
niXman
Эксперт C++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 21:45 #5
Цитата Сообщение от alexzak Посмотреть сообщение
Однако, если ты даже обернешь стандартный контейнер с указателями в свой класс, в деструкторе которого ты будешь удалять указатели, то с точки зрения RAII тоже будет все нормально.
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
1
NightmareZ
1340 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,919
11.09.2010, 21:52 #6
Цитата Сообщение от niXman Посмотреть сообщение
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
Тебя послушать, так вообще нельзя new/delete использовать
1
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.09.2010, 21:55 #7
Цитата Сообщение от NightmareZ Посмотреть сообщение
Тебя послушать, так вообще нельзя new/delete использовать
Таки насчет delete все правильно, а вот без new никуда.
1
niXman
Эксперт C++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 21:59 #8
Цитата Сообщение от NightmareZ Посмотреть сообщение
Тебя послушать, так вообще нельзя new/delete использовать
не нужно меня слушать. Страуструп и Саттер(а помоему и все остальные) всегда пишут о том, что new/delete следует избегать
1
easybudda
Модератор
Эксперт CЭксперт С++
9633 / 5581 / 948
Регистрация: 25.07.2009
Сообщений: 10,715
11.09.2010, 22:04 #9
Цитата Сообщение от #pragma Посмотреть сообщение
Я тут на форуме читал мнение,что хранение указателей в контейнерах - это плохо. Все,кто так думает,не могли бы вы обосновать данное утверждение с точки зрения C++ программирования?
По моему скромному - всё хорошо, когда с умом используется... Сортировать контейнер, содержащий указатели, в разы быстрее, ну а с созданием/инициализацией/удалением самих объектов, на которые указатели указывают, просто повнимательнее надо... Читал хороший пример в книжке про STL - один контейнер собственно с объектами и по контейнеру с указателями на объекты для каждого поля по которому часто сортировать приходится...
1
NightmareZ
1340 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,919
11.09.2010, 22:11 #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Таки насчет delete все правильно, а вот без new никуда.
Это таки как new без delete?

Цитата Сообщение от niXman Посмотреть сообщение
не нужно меня слушать. Страуструп и Саттер(а помоему и все остальные) всегда пишут о том, что new/delete следует избегать
Пруф?
1
niXman
Эксперт C++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 22:15 #11
Цитата Сообщение от NightmareZ Посмотреть сообщение
Пруф?
ты, иди книжки читай.
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.09.2010, 22:16 #12
Цитата Сообщение от NightmareZ Посмотреть сообщение
Это таки как new без delete?
Ну как-то так:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <boost/scoped_ptr.hpp>
 
int main() {
  boost::scoped_ptr<int> ptr(new int(100));
  
  std::cout << *ptr.get() << std::cout;
  
  return 0;
}
1
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
11.09.2010, 22:57 #13
Цитата Сообщение от niXman Посмотреть сообщение
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
Однако, если ты даже обернешь стандартный контейнер с указателями в свой класс, в деструкторе которого ты будешь удалять указатели, то с точки зрения RAII тоже будет все нормально.
1
niXman
Эксперт C++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 23:50 #14
alexzak, ты рилли до нот андэрстэнд, ор претэндинг?

Добавлено через 7 минут
это ссылка на тест без смарт поинтеров. у этого примера течет память.
это ссылка на тест со смарт поинтером. тут память ни в коем случае не утечет.

вопросы?

Добавлено через 19 минут
как известно, течь может не только память, но и к примеру, дескрипторы/хэндлеры/мьютексы.
вот пример RAII для файлового ввода-вывода: http://liveworkspace.org/code/ff30ca...7cfc54ad6d1ee4
2
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
12.09.2010, 02:43 #15
alexzak, товарищ Никсмен хочет намекнуть, что если исключение возникнет в конструкторе, то обьект считается несозданным и деструктор оного не вызовется.
То есть, по поводу деструктора и RAII ты прав, но только с вышеуказанным исключением.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2010, 02:43
Привет! Вот еще темы с ответами:

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей - C++
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей. Эта специализация...

Различия указателей char* от указателей других типов - C++
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что касается указателей на тип int. Но что...

Как обойтись без указателей и указателей на указатель? - C++
Ибо не совсем выходит понять,что на что тут указывает #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace...

Создание массивов указателей на массивы указателей - C++
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор ругается на то что не может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.09.2010, 02:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru