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

Как создать динамический массив структур? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Выведите на экран значение переменных в строку и в столбик http://www.cyberforum.ru/cpp-beginners/thread375875.html
Помогите написать программу на С: Введите три переменные a (тип int), b (тип double) и с (тип bool) их значение определите при инициализации. Выведите на экран значение переменных в строку и в столбик, используя оператор printf.
C++ Упорядочить блоки по величине их диагоналей (по убыванию значений их диагоналей). Итак, есть следующая задача: В заданной двумерной матрице выделить 3 блока по 2 строки и 2 столбца (блоки расположены на главной диагонали матрицы). Упорядочить блоки по величине их диагоналей (по убыванию значений их диагоналей). Сколько раз я не перечитывал условие, так и не смог его понять. Буду благодарен, если кто-нибудь объяснит мне, что от меня хотят, ну и заодно, при случае,... http://www.cyberforum.ru/cpp-beginners/thread375869.html
pictureBox C++
здравтсвуйте) в windows forms applications в pictureBox необходимо нарисовать сетку(таблицу), где нужно будет закрашивать элементы этой сетки по щелчку мыши и по двойному щелчку он бы "раскрашивался".(необходимо получить координаты в сетке этого прмоугольника-строку и столбец..) подскажите пожалуйста как это можно реализовать. весь алгоритм я написал но с этим крутой затык..
C++ как правильно?
подскажите как правильно записать? есть ли другой способ записать кроме этого? sqrt(sqrt(y/x))
C++ Найти в строке слово-перевертыш максимальной длины http://www.cyberforum.ru/cpp-beginners/thread375853.html
Дана строка в виде предложения. Найти в ней слово-перевертыш максимальной длинны. Словом будем считать набор символов, отделенных с двух сторон пробелами.
C++ STRING в численный тип char в число я умею переводить: atoi(),atol(),atof(). Но это C функции, со STRING не работают уже. Есть ли функция для STRING перевода в число или придётся самостоятельно прописывать? подробнее

Показать сообщение отдельно
Bers
Заблокирован
01.11.2011, 23:43     Как создать динамический массив структур?
Цитата Сообщение от ForEveR Посмотреть сообщение
tovar_list.push_back(tovar_ptr(new tovar());
tovar_list.back()->name = "name";
У меня к вам несколько вопросов:

1. Насколько безопаснее предоставить вектору самостоятельно построить объект с конструктором по умолчанию, по сравнению с внешним явным вызовом new tovar() ?
( При условии, что сами объекты исключений не кидают. И если и могут кинуть - то только потому, что агрегируют внутри себя другие вектора).

2. Насколько безопаснее сначала создать объект на стеке, а потом предоставить вектору самостоятельно выделить память под объект, и скопировать его к себе при помощи конструктора копирования, по сравнению с внешним явным вызовом new tovar() ?
( При условии, что сами объекты исключений не кидают. И если и могут кинуть - то только потому, что агрегируют внутри себя другие вектора).


Я просто так и не нашёл нигде информации о том, как именно вектор обеспечивает безопасную работу с памятью. Единственное, что я нашёл, это что теоретически он может кинуть bad_alloc.
И у меня возник вопрос: а он вообще хоть чем нибудь принципиально отличается от голого new в в плане безопасности?

Неужели, каждую операцию, которая теоретически может привести к реаллоку внутри вектора, нужно окружать ловушками исключений?

3. Создание объекта абы-где ведёт к фрагментации памяти, и падению производительности из-за кэш промахов и тп. Поэтому, однотипные объекты выгоднее держать в едином блоке данных.
(это не я придумал, это я вычитывал в умных книжках. Так что ногами не бейте).

Соответственно, выгоднее держать объекты в векторах, а не "просто так".
Но тогда их уже не подцепишь к интеллектуальному указателю. Потому что, если объект по факту живёт в векторе, всегда есть вероятность, что вектор сделает реалок, и все внешние ссылки станут не валидными.

Каким образом можно обеспечить проживание однотипных объектов в единых непрерывных блоках памяти, но так, что бы гарантировать, что внешние ссылки всегда будут оставаться валидными?

Мне единственное, что пришло в голову - это объектный пул памяти.
Пул создаёт вектор на 256 объектов. И этот вектор обречен всю жизнь иметь только 256 объектов. Объекты никак не перемешиваются. Они только помечаются как "занятый", или "свободный".

(если объектиков не слишком много, и сами они не слишком тяжелые, можно сделать стековый пул. Будит очень шустрая работа. Классная вещь, если нада в каждом новом кадре создавать сотни мелких объектиков, а к концу кадра их все удалять. В этом деле шаблоны с++ великолепная вещь)

Не хватило 256 мест - пул ещё один такой же сделает, теперь будит 512. И тоже до конца работы приложения. Потом он сам за собой почистит.

Но при таком подходе, единственное, зачем может быть нужен интеллектуальный указатель - это контролировать сколько внешних пользователей ссылаются на объект (ну то есть, можно его уже пометить как "свободный", или ещё нельзя. А если в конце работы, на момент ликвидации пула окажется, что на его объекты ещё кто то там снаружи ссылается - значит где то там наверху была допущена "утечка").

Вопрос такой, а можно добиться схожего эффекта, только как нить попроще?
Объектный пул в некоторых специфических ситуациях мне кажется излишним...
Нужно, что бы объекты создавались в массивах, но внешние ссылки не боялись реаллоков.
Что бы можно было бы спокойно добавлять объекты, и удалять.

Если такое получится, во многих случаях надобность в интеллектуальных указателях просто отпадёт.

А покамест, я вот сейчас сижу и думаю, ничто же не мешает сделать специализированный смартпоинтер, который завязан на индексе объекта в векторе, а не его указателе...
 
Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru