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

Непрерывное выделение памяти - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
30.03.2013, 15:27     Непрерывное выделение памяти #1
Здорова!
Есть запутанная задачка на непрерывное выделение памяти.
Ладно по порядку.
Есть класс:
C++
1
2
3
4
5
6
7
8
class Char_vec
{
    int sz;
    char element[1];
public:
    static Char_vec* new_char_vec(int s);
    char& operator[](int i){return element[i];}
};
И от условие самой задачи:

Определите new_char_vec(), выделяющую непрерывную память для Char_vec таким образом, чтобы доступ к элементу мог осуществляться по индексу через element. При каких обстоятельствах этот трюк может вызвать серьезные проблемы?

Я от все думал думал никак не пойму как же мне память выделить?
Метод то ведь статический хз.
Вообще задачу не пойму.
Да и память в методе никак выделить не могу, да и понятия нету как ее выделить

я просто например создаю
C++
1
2
3
4
5
6
7
8
9
Char_vec a;//ob6ekt Char_vec
    //a.new_char_vec(3);
    //b=a.new_char_vec(3);
    a[1]='3';
    a[0];
    cout <<a[2]<<endl;
    cout <<a[1]<<endl;
    a[5]='5';
    cout <<a[5]<<endl;
У меня ни каких ошибок не появляется и a[1] есть и a[5] есть как то память толи сама выделяется толи хз.
Что здесь вообще нужно было сделать кто знает?

п.с. не люблю такие тупые задачи.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 15:27     Непрерывное выделение памяти
Посмотрите здесь:

C++ выделение памяти
C++ выделение памяти
C++ Выделение памяти
Выделение памяти C++
Выделение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
30.03.2013, 17:53     Непрерывное выделение памяти #2
Placement syntax
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 00:16  [ТС]     Непрерывное выделение памяти #3
Цитата Сообщение от gazlan Посмотреть сообщение
Да это не то.

Мне нужно как то определить метод static Char_vec* new_char_vec(int s);
Например написать в нем Char_vec * a=new Char_vec[s]; return a; , токо чо оно мне даст.
Правильно нужно решить задачу. Дан класс и условие.
Как память выделять я то знаю. Токо как для этой задачи выделить хз.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
31.03.2013, 00:39     Непрерывное выделение памяти #4
Аллокируете свой буфер - сколько надо или с запасом. Каждый вызов new_char_vec() будет возвращать указатель - смещение следующего блока памяти (0, n1, n2...)

static означает, что эта память общая для всех экземпляров класса (a la Global Heap).

Представьте, что вы батон колбасы режете: каждый получает свой кусок, и каждый новый кусок начинается там, где кончился предыдущий.

В реальных менеджерах еще проверяется запись за пределы блоков, ведется учет освобождаемых блоков и используется какая-либо стратегия дефрагментации памяти.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 01:00  [ТС]     Непрерывное выделение памяти #5
Цитата Сообщение от gazlan Посмотреть сообщение
Аллокируете свой буфер - сколько надо или с запасом. Каждый вызов new_char_vec() будет возвращать указатель - смещение следующего блока памяти (0, n1, n2...)

static означает, что эта память общая для всех экземпляров класса (a la Global Heap).

Представьте, что вы батон колбасы режете: каждый получает свой кусок, и каждый новый кусок начинается там, где кончился предыдущий.

В реальных менеджерах еще проверяется запись за пределы блоков, ведется учет освобождаемых блоков и используется какая-либо стратегия дефрагментации памяти.
Да ничего я не понял.
Чем мне полезна эта функция?
Если у меня просто без выделения памяти она как бы выделяется.
От программка:
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
//klass Char_vec
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
class Char_vec
{
    int sz;
    char element[1];
public:
    static Char_vec* new_char_vec(int s)
    {
        cout <<"my tyt "<<s<<' '<<endl;
        //Char_vec* a=new Char_vec[3];
    }
    char& operator[](int i){return element[i];}
};
 
int main()
{
    Char_vec a;//ob6ekt Char_vec
    a[1]='3';
    a[5]='4';
    cout <<a[1]<<a[5]<<endl;
    
    return 0;
}
от мы видим что в a[1] записалось 3, а в a[5] записалось 4.

При выводе выводит 34
Как это объяснить?
И как я могу применять эту статическую функцию?

Добавлено через 5 минут
И вообще как я на практике могу порезать этот батон памяти, чото я ничо не пойму?

Добавлено через 1 минуту
я от понимаю кода мы указатель на тип char создаем указываем его размер, ну а в этой функции new_char_vec(int) нафига int параметр передается?
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
31.03.2013, 01:31     Непрерывное выделение памяти #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Да ничего я не понял
Ну, так пройдите, наконец, по ссылке - и почитайте. И просто поищите по "Placement new" - найдете много интересного.


от мы видим что в a[1] записалось 3, а в a[5] записалось 4.

При выводе выводит 34
Как это объяснить?
Добавьте еще, например,
C++
1
 a[10]='5';
- и все станет понятно без объяснений.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 01:35  [ТС]     Непрерывное выделение памяти #7
Цитата Сообщение от gazlan Посмотреть сообщение
Ну, так пройдите, наконец, по ссылке - и почитайте. И просто поищите по "Placement new" - найдете много интересного.
Да я английский не шарю мне бы на русском. Щас еще попробую с гугл-переводчиком почитать.

Добавлено через 1 минуту
Так и а[10]=5; нормально выводится.
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
31.03.2013, 01:37     Непрерывное выделение памяти #8
new (C++)
Placement new

на русском.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 01:46  [ТС]     Непрерывное выделение памяти #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Char_vec a;//ob6ekt Char_vec
    a[1]='3';
    a[5]='4';
    a[10]='5';
    a[100]='6';
    a[100]='7';
    cout <<a[1]<<a[5]<<a[10]<<a[100]<<a[1000]<<endl;
    
    return 0;
}
и выводиться 3457

Добавлено через 1 минуту
нет ну я знаю что такое new и delete

Добавлено через 2 минуты
gazlan, а ты имеешь в веду, что можно создать указатель на массив? Или чо? хз.

Добавлено через 1 минуту
я так смотрю шестерка затерялась в верху.

Добавлено через 23 секунды
должно б вывести 34567

Добавлено через 1 минуту
Не ничо не затерялось, то я просто в коде ошибся a[100]=7 второй раз написал.

Добавлено через 1 минуту
gazlan, от смотри оно ж тупо память само выделяет без выделения?
gazlan
2861 / 1809 / 272
Регистрация: 27.08.2010
Сообщений: 4,893
Записей в блоге: 1
31.03.2013, 01:49     Непрерывное выделение памяти #10
У вас стек давно разрушен - вы пишете за границами выделенной памяти, что оно там выводит - дело случая.

Прочтите, наконец, теорию - хоть в книжке, хоть в инете. По поиску "Placement new" можно и на русском найти все, что угодно - и статьи, и примеры.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 02:31  [ТС]     Непрерывное выделение памяти #11
static Char_vec* new_char_vec(int s);
Я от смотрю на этот метод и явно ж видно, что он должен вернуть указатель на тип Char_vec, то значит полюбому внутри него должен создаться новый объект Char_vec либо выделится место динамически. Чтобы мы это место могли вернуть. Ну так это место для одного символа выделяется. Вроде как я понимаю вес объекта равен весу его членов. а у нас всего один член это char element[1] , и то это ссылка или как его назвать? хз почему именно element[1], а не просто element?

Добавлено через 8 минут
Цитата Сообщение от gazlan Посмотреть сообщение
У вас стек давно разрушен - вы пишете за границами выделенной памяти, что оно там выводит - дело случая.

Прочтите, наконец, теорию - хоть в книжке, хоть в инете. По поиску "Placement new" можно и на русском найти все, что угодно - и статьи, и примеры.
А ну я понял, что ты имееш в веду типо я вышел за границы как бы определенной памяти. Это же самое и для типа int происходит например, мы создадим int mass[100]; и указателю присвоим int* p=&m[0]; , а затем сделаем p-- то мы якобы выйдем за границы памяти, но ошибка, то ведь не происходит?

Например как мне тогда определить границы выхода за пределы допустимой памяти?
Если брать пример выше, то там для массива как бы резервируется 100 адрессов памяти и если мы выходим за пределы массива, то адрес ячейки не будет соответствовать адресу какой либо ячейки массива.
Там то все ясно, а как же мне для моего примера определить границы? Или просто проверить на выход за пределы, мне это не нужно впринципе мне нужно решить как нибуть задачу.

Если шариш помоги лучше метод определить static Char_vec* new_char_vec(int s), а то я никак не допру чо в него записать, и как же мне его нужно использовать. Да и вообще какой то класс туманный фиг чо понятно нафига он вообще нужен.

Добавлено через 9 минут
Я так смотрю никто не знает, и задачка интересная, и никто не знает ну ладно сам допру.

Добавлено через 29 секунд
Некому помочь. Сам не сделаешь фиг кто сделает.

Добавлено через 27 секунд
Делать нечего придется самому разбирать, а жаль.

Добавлено через 17 минут
gazlan, Старичок я просто тупанул. Я все понял это мы просто как бы аналог new создаем. А я на своей волне про другое думал. Все разобрался просто конструктор создать и все. И дело в шляпе. Этот конструктор просто вызывать из статического метода. Легко и просто.

Добавлено через 4 минуты
Да ничо не выходит как всегда.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
31.03.2013, 16:15     Непрерывное выделение памяти #12
Хм... То что будет написано ниже, это чисто моё субъективное мнение и вполне возможно ошибочное. Но, смею всё же изложить его:

Суть метода заключается в том, чтобы выделить непрерывную память для вектора ваших объектов Char_vec, но использовать её непосредственно для вектора element. Т.е. при выделении память под 1 объект класса Char_vec будет выделено 5, но с учётом выравнивания - 8 байт. Теперь мы вычисляем сколько необходимо памяти, т.е. под сколько объектов класса Char_vec нужно выделить память:
C++
1
size_t count = (sizeof(int) + s) / sizeof(Char_vec) + 1;
Всё, теперь можем использовать наш ЕДИНСТВЕННЫЙ объект, всё остальное - это память для поля element. Единственное что необходимо помнить, объект нужно удалять как вектор, т.е. delete[].
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
#include <iostream>
 
class Char_vec
{
   protected:
      int sz;
      char element[1];
 
   public:
      static Char_vec* new_char_vec(int s)
      {
         size_t count = (sizeof(int) + s) / sizeof(Char_vec) + 1;
         Char_vec* vec = new Char_vec[count];
         vec->sz = s;
 
         return vec;
      }
      char& operator[](int i){return element[i];}
};
 
 
int main()
{
   int count = 20;
 
   Char_vec* vec = Char_vec::new_char_vec(count);
 
   for (int i = 0; i < count; ++i)
   {
      (*vec)[i] = 32 + i;
   }
 
   for (int i = 0; i < count; ++i)
   {
      std::cout << (*vec)[i] << " ";
   }
 
   delete[] vec;
 
   return 0;
}
P.S.: для не POD объектов я не решусь определить поведение.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
31.03.2013, 16:34  [ТС]     Непрерывное выделение памяти #13
я так сделал как бы по примеру из ссылки про placement New
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
//klass Char_vec
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
class Char_vec
{
    int sz;
    char element[1];
public:
    Char_vec(int)
    {}
     
    static Char_vec* new_char_vec(int s)
    {
        cout <<"my tyt "<<s<<' '<<endl;
        Char_vec* placementMemory = static_cast<Char_vec*>(operator new[] (s * sizeof(Char_vec)));
        for (int i = 0; i < s; i++)
        {
          new (placementMemory + i)Char_vec(rand()); //здесь память для объекта не выделяется, но инициализируется
        }
         
        return placementMemory;
    }
     
    char& operator[](int i){return element[i];}
};
 
int main()
{
    Char_vec* a=Char_vec::new_char_vec(30);//ob6ekt Char_vec как бы из 30 элементов
    (*a)[1]='3';
    cout <<(*a)[1]<<endl;
     
    return 0;
}
Добавлено через 2 минуты
Тоже самое токо я синтаксис в своей программе не сильно понимаю, так сделал по примеру без понятия.

Добавлено через 1 минуту
Не ну я понимаю, что сначала выделяется громадная область памяти, а затем она делиться, просто синтаксис такой первый раз вижу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2013, 17:10     Непрерывное выделение памяти
Еще ссылки по теме:

C++ выделение памяти
Выделение памяти C++
Выделение памяти(С = С++) C++

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

Или воспользуйтесь поиском по форуму:
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
31.03.2013, 17:10     Непрерывное выделение памяти #14
Когда вы выделяете память под объекты, естественно это память непрерывна, и самое главное - она выделена. Вам уже решать как ей распоряжаться. Так вот, эту непрерывную память вы просто отдаёте element. Если бы в объявлении данный массив стоял первый, а sz второй, то вы бы своими действиями перекрывали sz, но так как он последний, то после него идёт выделенная память под второй объект, так вот вы её просто используете для element первого. Посмотрите рисунок, я думаю, вам станет понятно:
Непрерывное выделение памяти
Yandex
Объявления
31.03.2013, 17:10     Непрерывное выделение памяти
Ответ Создать тему
Опции темы

Текущее время: 18:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru