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

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

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

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

11.09.2010, 14:28. Просмотров 2151. Ответов 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...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
12.09.2010, 13:45     Хранение указателей в контейнерах #21
alexzak, что, если исключение возникнет во время push_back ? Например, при аллокации на платформе с ограниченными ресурсами.

UPD. Да принципе ничего не должно случиться.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.09.2010, 13:48     Хранение указателей в контейнерах #22
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
что, если исключение возникнет во время push_back ? Например, при аллокации на платформе с ограниченными ресурсами.
значит еще и его нужно в try-catch обернуть
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
12.09.2010, 20:04     Хранение указателей в контейнерах #23
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
alexzak, что, если исключение возникнет во время push_back ? Например, при аллокации на платформе с ограниченными ресурсами.

UPD. Да принципе ничего не должно случиться.
Все будет нормально, для этого и unique_ptr. Можно заменить на auto_ptr, разницы нет. В принципе это типичный метод (try-catch(...)-throw). Даже в стандартной библиотеке dinkumware так в некоторый местах делается до сих пор. Но это можно элементарно реструктруировать в автоматический объект, что я оставил на потом (не всё же сразу показывать ).

Но, естественно, здесь есть свой tradeoff. Какой? Кто скажет?

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
53
54
55
#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 {
    struct proctor {
        proctor(std::vector<test*> & val)
            : svec(val)
        {}
 
        ~proctor() {
            for (auto it = svec.begin(); it != svec.end(); ++it) {
                delete *it;
            }
        }
 
        std::vector<test*> & svec;
    };
 
   not_safe_raii()
       : svec()
       , svec_owner(svec)
    {
        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 ;)");
            }
        }
    }
 
private:
   enum { count = 10 };
   std::vector<test*> svec;
   proctor svec_owner;
};
 
int main() {
   try {
      not_safe_raii data;
   } catch ( const std::exception& e ) {
      std::cout << "exception throwing: " << e.what() << std::endl;
   }
}
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
12.09.2010, 20:28     Хранение указателей в контейнерах #24
Блин, что-то туплю.

Добавлено через 15 минут

Не по теме:

alexzak, слух, а тебе никсман похерил репу?

niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.09.2010, 20:29     Хранение указателей в контейнерах #25
ппц. довел до состояния спагетти
скажи, ты намеренно все в кал превращаешь?

Добавлено через 23 секунды
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
тебе никсман похерил репу?
угу. за говнокод.
alexzak
84 / 57 / 1
Регистрация: 07.08.2010
Сообщений: 185
12.09.2010, 20:37     Хранение указателей в контейнерах #26
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
что на случай попытки встатить код между push_back и release?
Это, кстати, хороший вопрос. В С++ в некоторых местах программы нельзя допускать исключений ни при каких обстоятельствах. Иначе невозможно писать правильные с точки зрения управления ресурсами программы. Это одно из таких мест. Другое (типичное) место - функция swap, на которой основана идиома copy-and-swap.
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
12.09.2010, 20:46     Хранение указателей в контейнерах #27
Цитата Сообщение от alexzak Посмотреть сообщение
Это, кстати, хороший вопрос. В С++ в некоторых местах программы нельзя допускать исключений ни при каких обстоятельствах. Иначе невозможно писать правильные с точки зрения управления ресурсами программы. Это одно из таких мест. Другое (типичное) место - функция swap, на которой основана идиома copy-and-swap.
Насколько я знаю, с новым синтаксисом ситуация с ф-цией swap поменяется кардинальным образом - больше нет копирования, соответственно не возникнет потенциальных исключений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2010, 23:04     Хранение указателей в контейнерах
Еще ссылки по теме:

Нотация указателей - 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++
Помогите пожалуйста отсортировать массив указателей на строки. Сортировка должна быть по первой букве строки. Заранее благодарю... ...


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

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.09.2010, 23:04     Хранение указателей в контейнерах #28
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
Насколько я знаю, с новым синтаксисом ситуация с ф-цией swap поменяется кардинальным образом - больше нет копирования, соответственно не возникнет потенциальных исключений.
а вот это уже интересно. почитаем-ка...
Yandex
Объявления
12.09.2010, 23:04     Хранение указателей в контейнерах
Ответ Создать тему
Опции темы

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