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

Выделение динамической памяти для двумерного массива. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Конвертация int в char* http://www.cyberforum.ru/cpp-beginners/thread117691.html
Доброго времени суток!!! Пытаюсь конвертировать int в char* стандартными средствами c++. Приложение компилируется, но вовремя выполнения выдаёт ошибку Access violatation. char *a; int b = 12; a = (char*)b; cout << a; Причём ошибка возникает когда я пытаюсь вывести значение a.
C++ Анимация в Borland C++ v.3 Всем привет! Подскажите пожалуйста как делать анимацию в графическом(dos) режиме http://www.cyberforum.ru/cpp-beginners/thread117686.html
Потоки и приоритеты C++
Привет всем кто увидит это сообщение))) вот мое задание и код программы, если увидите что то не правильно подскажите пожалуйста=) так вот у меня такой вопрос... как подсчитать время выполнение потока))) скажите пожалуйста, а то целый день не могу разобраться((( задание. Разработать программу для вычисления полного количества секунд, прошедших между двумя значениями времени. Значение времени –...
C++ С++ Указатели.
1. Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами. 2.Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами. Может кто-нибудь поспособствовать решению? з.ы. Нужно 4 программы: 2 в статике, 2 в динамике.
C++ Удалить повторяющиеся слова в строке http://www.cyberforum.ru/cpp-beginners/thread117633.html
Здравствуйте! Как удалить из строки типа char, введенной с помощью cin.getline(buf, 80), одинаковые слова (слова могут быть разделены одним или несколькоми пробелами и знаками табуляции)? В полученной строке слова должны быть разделены только одним пробелом. Можно записать неповторяющиеся слова в новую строку. Но я что-то не могу понять как это сдалать((. Помогите, кто знает :) Добавлено...
C++ Напечатать треугольник Паскаля — таблицу биномиальных коэффициентов дано целое неотрицательное число K. Напечатать треугольник Паскаля - таблицу биномиальных коэффициентов (C из m по n) для всех возможных целых значений m и n(0<=m<=n<=K) подробнее

Показать сообщение отдельно
msangel
 Аватар для msangel
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
05.05.2010, 05:37     Выделение динамической памяти для двумерного массива.
да, это как минимум странно

я решил посмотреть как в таких случаях меняются адреса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    int *matr2 = new int [10];
    delete []matr2;
    //matr2 = NULL;
    printf("%d\n",matr2);
    matr2[-1]=26;
    printf("%d\n",matr2[-1]);
    printf("%d\n",&matr2[-1]);
    matr2[-2]=26;
    printf("%d\n",matr2[-2]);
    printf("%d\n",&matr2[-2]);
    matr2[1]=26;
    printf("%d\n",matr2[1]);
    printf("%n",&matr2[1]);
в результате у меня вишло -
C
1
2
3
4
matr2 = 3435312//адрес 0-го елемента
&matr2[1] = 3435316//адрес [1] елемента, что как видим на 4 больше чем у [0] т.е. sizeof(int)
&matr2[-1] = 3435308//адрес [-1] елемента, что как видим на 4 менше чем у [0]
&matr2[-2] = 3435304// еще на 4 менше
возникает следующие вопросы:
получается я могу розмещать в памяти за нужным мне адресом нужные объекты, если придумаю способ их сериализации в память?
конешно, возможно такой способ выделения памяти опасен тем, что приложение может по моих адресах разместить свои даные... хотя я об етом ничего не знаю...
как приложение управляет своей памятью? наверное у каждого приложения во время роботы создается таблица, где оно хранит используемые адреса, чтоб при динамичесском выделении памяти просто не писать поверх и указывать на свободные участки? возможно даже функции malloc/free и операторы new/delete и соответственно работают с такой таблицей?
или это в конце концов просто баг компилятора?

Добавлено через 22 минуты
да, я был прав
http://www.parashift.com/c++-faq-lit....html#faq-38.8
там написано об том, как выделяется динамеческая память

как я и предполагал - объекты пишутся прамо в память по смещению относительно указателя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 // Original code: Fred* p = new Fred[n];
 Fred* p = (Fred*) operator new[] (n * sizeof(Fred));
 size_t i;
 try {
   for (i = 0; i < n; ++i)
     new(p + i) Fred();           // Placement new
 }
 catch (...) {
   while (i-- != 0)
     (p + i)->~Fred();            // Explicit call to the destructor
   operator delete[] (p);
   throw;
 }
 arrayLengthAssociation.insert(p, n);
где p - собственно указатель и
for (i = 0; i < n; ++i)
new(p + i) Fred(); - запись одного елемента по смещению

но самое интерестное тут:
arrayLengthAssociation.insert(p, n);
в хелпе написано, что:
arrayLengthAssociation is the imaginary name of a hidden, global associative array that maps from void* to "size_t"
ну естественно тут непоказано алгоритмы для поиска свободного участка памяти через этот глобальный асоциативный масив, и установление указателя на эту область.

а в реализации все делается наоборот:
// Original code: delete[] p;
C++
1
2
3
4
size_t n = arrayLengthAssociation.lookup(p);
 while (n-- != 0)
   (p + n)->~Fred();
 operator delete[] (p);

гм) теперь все логично.
именно поэтому мы свободно можем писать в любую (свободную) точку памяти.
всем спасибо за помощь.

Добавлено через 14 минут
нет
ну естественно тут непоказано алгоритмы для поиска свободного участка памяти через этот глобальный асоциативный масив, и установление указателя на эту область.
arrayLengthAssociation наверное работает только с количествами.
следовательно должен быть еще что-то, но уже с адресами

Добавлено через 23 минуты
так же было б интерестно узнать, как виделяется память под одну переменную\\
наверно программа просит об этом операционную систему
однако что то не могу найти таких исходников\\

Добавлено через 24 минуты
оу, уже нашел)))
http://en.wikipedia.org/wiki/Memory_pool
в ссилках под статьей интерестный исходник

и наверное выделеная таким образом память плюсуется к памяти приложения, расшыряя его адресное пространство
за это наверное тоже отвечают функции malloc/free и операторы new/delete - кроме всего они еще при необходимости запрашуют еще блок памяти или освобождают его))))

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