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

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

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

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

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

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

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

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

Инициализация указателей - C++
Добрый вечер, объясните пожалуйста, что значит присвоение начальных значений указателям, как например в данном случае: float *fPtr =...

массив указателей - C++
int abc=0; for (int i=0;i<resultFile.count();i++){ for (int j=0;j<_H400_H419.count();j++){ ...

Вектор указателей - C++
Добрый день) Припустим что у нас есть вектор указателей на что... то, какой размер он будет занимать?) #include <iostream> припустим...

использование указателей - C++
не знал как тему даже назвать :-class CTest { public: int x; void xpp() { x++; } };

Использование указателей - C++
Не могли бы вы показать как решить это через указатели. Решение правильное. #include <iostream> #include <cstring> using namespace...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 14:39     Хранение указателей в контейнерах #2
а что тут обосновывать? не RAII это, потому и зло.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.09.2010, 21:02     Хранение указателей в контейнерах #3
copy-and-swap
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 тоже будет все нормально.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 21:45     Хранение указателей в контейнерах #5
Цитата Сообщение от alexzak Посмотреть сообщение
Однако, если ты даже обернешь стандартный контейнер с указателями в свой класс, в деструкторе которого ты будешь удалять указатели, то с точки зрения RAII тоже будет все нормально.
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.09.2010, 21:52     Хранение указателей в контейнерах #6
Цитата Сообщение от niXman Посмотреть сообщение
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
Тебя послушать, так вообще нельзя new/delete использовать
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.09.2010, 21:55     Хранение указателей в контейнерах #7
Цитата Сообщение от NightmareZ Посмотреть сообщение
Тебя послушать, так вообще нельзя new/delete использовать
Таки насчет delete все правильно, а вот без new никуда.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 21:59     Хранение указателей в контейнерах #8
Цитата Сообщение от NightmareZ Посмотреть сообщение
Тебя послушать, так вообще нельзя new/delete использовать
не нужно меня слушать. Страуструп и Саттер(а помоему и все остальные) всегда пишут о том, что new/delete следует избегать
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
11.09.2010, 22:04     Хранение указателей в контейнерах #9
Цитата Сообщение от #pragma Посмотреть сообщение
Я тут на форуме читал мнение,что хранение указателей в контейнерах - это плохо. Все,кто так думает,не могли бы вы обосновать данное утверждение с точки зрения C++ программирования?
По моему скромному - всё хорошо, когда с умом используется... Сортировать контейнер, содержащий указатели, в разы быстрее, ну а с созданием/инициализацией/удалением самих объектов, на которые указатели указывают, просто повнимательнее надо... Читал хороший пример в книжке про STL - один контейнер собственно с объектами и по контейнеру с указателями на объекты для каждого поля по которому часто сортировать приходится...
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
11.09.2010, 22:11     Хранение указателей в контейнерах #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Таки насчет delete все правильно, а вот без new никуда.
Это таки как new без delete?

Цитата Сообщение от niXman Посмотреть сообщение
не нужно меня слушать. Страуструп и Саттер(а помоему и все остальные) всегда пишут о том, что new/delete следует избегать
Пруф?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 22:15     Хранение указателей в контейнерах #11
Цитата Сообщение от NightmareZ Посмотреть сообщение
Пруф?
ты, иди книжки читай.
CyBOSSeR
Эксперт C++
2299 / 1669 / 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;
}
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
11.09.2010, 22:57     Хранение указателей в контейнерах #13
Цитата Сообщение от niXman Посмотреть сообщение
а что произойдет, в случае, когда будет сгенерировано исключение? где окажется ваш вариант RAII?
Однако, если ты даже обернешь стандартный контейнер с указателями в свой класс, в деструкторе которого ты будешь удалять указатели, то с точки зрения RAII тоже будет все нормально.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2010, 23:50     Хранение указателей в контейнерах #14
alexzak, ты рилли до нот андэрстэнд, ор претэндинг?

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

вопросы?

Добавлено через 19 минут
как известно, течь может не только память, но и к примеру, дескрипторы/хэндлеры/мьютексы.
вот пример RAII для файлового ввода-вывода: http://liveworkspace.org/code/ff30ca...7cfc54ad6d1ee4
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
12.09.2010, 02:43     Хранение указателей в контейнерах #15
alexzak, товарищ Никсмен хочет намекнуть, что если исключение возникнет в конструкторе, то обьект считается несозданным и деструктор оного не вызовется.
То есть, по поводу деструктора и RAII ты прав, но только с вышеуказанным исключением.
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
12.09.2010, 04:10     Хранение указателей в контейнерах #16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Ну как-то так:
Ну фактически то delete всё-равно будет, просто за его вызов отвечает умный указатель.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
12.09.2010, 06:33     Хранение указателей в контейнерах #17
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
alexzak, товарищ Никсмен хочет намекнуть, что если исключение возникнет в конструкторе, то обьект считается несозданным и деструктор оного не вызовется.
То есть, по поводу деструктора и RAII ты прав, но только с вышеуказанным исключением.
Товарищ Никсмен написал говнокод, а потом убедил себя, что по-другому нельзя. Он не понимает, как правильно проводить инициализацию в конструкторе. Поэтому я ему это сейчас продемонстрирую:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include <stdexcept>
#include <algorithm>
 
struct test {
   test() { std::cout << "constructor called 0x" << this << std::endl; }
   ~test() { std::cout << "destructor called 0x" << this << std::endl; }
};
 
struct not_safe_raii {
   not_safe_raii() {
      try {
          for (int i = 0; i < count; ++i) {
             std::unique_ptr<test> obj(new test());
             svec.push_back(obj.get());
             obj.release();
 
             if (i == 4) {
                throw std::runtime_error("Oops ;)");
             }
          }
       } catch (...) {
           clear();
           throw;
       }
   }
 
   ~not_safe_raii() {
        clear();
   }
 
private:
    void clear() {
      for (auto it = svec.begin(); it != svec.end(); ++it) {
         delete *it;
      }
    }
private:
   enum { count = 10 };
   std::vector<test*> svec;
};
 
int main() {
   try {
      not_safe_raii data;
   } catch ( const std::exception& e ) {
      std::cout << "exception throwing: " << e.what() << std::endl;
   }
}
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
12.09.2010, 11:18     Хранение указателей в контейнерах #18
Цитата Сообщение от NightmareZ Посмотреть сообщение
Ну фактически то delete всё-равно будет, просто за его вызов отвечает умный указатель.
В этом то и прелесть - не надо следить за удалением объекта. Даже если возникнет исключение, память почистится, что собственно нам и нужно.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.09.2010, 13:22     Хранение указателей в контейнерах #19
alexzak, блок try-catch в конструкторе это шедевр. сам придумал?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2010, 13:39     Хранение указателей в контейнерах
Еще ссылки по теме:

Нотация указателей - C++
Преподователь попросил применить нотацию указателей вместо нотации массивов, помогите пожалуйста. Вот мой код #include &lt;iostream&gt; ...

Загадка указателей - C++
Здравствуйте =) Привел меня к Вам следующий вопрос. Поступило задание составить программу для решения квадратного уровнения, используя...

Массив указателей - C++
Есть ли аналог нижеуказанной строки в си? Создается массив указателей, необходим для работы с функциями работы с виртуальной памятью...

удаление указателей - C++
Я создал указатель и выделил память vector &lt; vector &lt;Obj&gt; &gt; *p_L = new vector&lt; vector &lt;Obj&gt; &gt;; Как мне теперь освободить...

Массив указателей - C++
Помогите пожалуйста отсортировать массив указателей на строки. Сортировка должна быть по первой букве строки. Заранее благодарю... ...


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

Или воспользуйтесь поиском по форуму:
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
12.09.2010, 13:39     Хранение указателей в контейнерах #20
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
В этом то и прелесть - не надо следить за удалением объекта. Даже если возникнет исключение, память почистится, что собственно нам и нужно.
В чём разница: самописный он будет юзать контейнер или из буста?
Yandex
Объявления
12.09.2010, 13:39     Хранение указателей в контейнерах
Ответ Создать тему
Опции темы

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