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

О перевыделении памяти для массива объектов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ сортировка вектора sort() http://www.cyberforum.ru/cpp-beginners/thread929937.html
программа заполняет вектор рандомными числами в диапазоне от 1 до 100 сортирует с помощью алгоритма sort(.begin(),.end()) - в восходящем порядке можно ли отсортировать с помощью sort() - в нисходящем порядке? #include <iostream> using namespace std; #include <ctime> #include <vector>
C++ Как работать с ресурсами? Visual C++ Как запихнуть .exe файл в программу и из программы считать .exe файл...? чтобы в итоге один .exe содержал другой .exe и мог последний извлекать... http://www.cyberforum.ru/cpp-beginners/thread929936.html
Подскажите как прекратить чтение из файла? C++
Есть программа: #include<iostream> #include<fstream> using namespace std; int main() { ifstream cin("in.txt"); int name; while(true) {
Механизмы онлайн игр C++
Как в онлайн играх происходит одновременое отображение действий персонажа, к примеру, на всех экранах играющих? Игрок, к примеру, нажимает на какое-то умение, информация об этом отправляется на сервер, а сервер высылает всем игрокам строку типа "игрок:id111;действие:id10;" и все игроки обрабатывают эту строку и прорисовыва.т нужное действие, так? если так, то как можно снизить нагрузку на...
C++ Калькулятор в книге Страуструпа http://www.cyberforum.ru/cpp-beginners/thread929886.html
Я знал, что это довольно тяжелая книга, поэтому начал читать ее после другой о С++, но пример "элементарного" калькулятора поставил меня в тупик с первых же строк. В этой теме я буду задавать вопросы относительно него по частям. Вот с самого начала: это всё вообще что? Даже не псевдокод, почему END в начале? Что за выражения? Что за термы? Первичное? Выражения? Прочитал весь пример, и так...
C++ Определение количества разрядов у числа Написал программку, которая должна определять количество разрядов у чисел. При вводе двухзначных и трехзначных, программа правильно определяет разряд, но при вводе четырехзначных чисел и более, начинает определять неправильно. Помогите определить проблему. #include<iostream> using namespace std ; int main() { int dvoich, chislo,razryd = 0, del = 1; cout << "Enter 2-oe chislo: " ; cin... подробнее

Показать сообщение отдельно
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
28.07.2013, 19:24     О перевыделении памяти для массива объектов
http://ideone.com/WQ63ec
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
 
static int default_constructed = 0;
static int constructed = 0;
static int copied = 0;
static int moved = 0;
static int destroyed = 0;
 
struct Foo
{
    std::string attr1;
    std::vector<int> attr2;
 
    Foo() : attr1(), attr2() { ++default_constructed; }
 
    Foo(const std::string &str,
        const std::vector<int> &v) :
            attr1(str), attr2(v) { ++constructed; }
 
    Foo(Foo &&x) :
            attr1( std::move(x.attr1) ),
            attr2( std::move(x.attr2) ) { ++moved; }
 
    Foo(const Foo &x) : Foo(x.attr1, x.attr2) { ++copied; }
 
    ~Foo() { ++destroyed; }
};
 
int main()
{
    std::allocator<Foo> alloc;
 
    // выделим место под 100 объектов Foo
    Foo *array100 = alloc.allocate(100);
 
    // запишем кол-во
    size_t size = 100;
 
    // и сконструируем столько же
    std::uninitialized_fill( array100,
                             array100 + size,
                             Foo("string", {1000, 42}) ); // constructed = 1 (ref)
                                                          // copy constructed = 100
                                                          // destroyed = 1
 
    // увеличим место - 1000
    Foo *array1000 = alloc.allocate(1000);
    size_t new_size = 1000;
 
    // объекты array100 нужно переместить в новое место
    // если тип обладает перемещающим конструктором, то будет использован именно он
    std::uninitialized_copy( std::make_move_iterator(array100),
                             std::make_move_iterator(array100 + size),
                             array1000 ); // move constructed = 100
 
    // инициализируем остальные 900 элементов
    std::uninitialized_fill( array1000 + size,
                             array1000 + new_size,
                             Foo("string v2", {1000, 87}) ); // constructed = 1 (ref)
                                                             // copy constructed = 900
                                                             // destroyed = 1
 
    // объекты array100 больше не валидны
    std::for_each(array100, array100 + size, [&alloc](Foo &x) { x.~Foo(); } );
                                                            // destroyed = 100
 
    // освободим место под array100
    alloc.deallocate(array100, size);
    array100 = nullptr;
 
    // обновим размер
    size = new_size;
 
    // array1000 больше не нужен
    // уничтожим объекты
    std::for_each(array1000, array1000 + size, [&alloc](Foo &x) { x.~Foo(); } );
                                                            //destroyed = 1000
 
    // освободим память
    alloc.deallocate(array1000, size);
 
    // перестраховка
    array1000 = nullptr;
 
    std::cout << "Objects default constructed = " << default_constructed
              << "\nObjects constructed = " << constructed
              << "\nObjects copy constructed = " << copied
              << "\nObjects move constructed = " << moved
              << "\nObjects destroyed = " << destroyed;
 
    return 0;
}
 
Текущее время: 06:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru