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

Как выглядит изнутри динамическое выделение объекта через new? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ new - это операция или все таки оператор? http://www.cyberforum.ru/cpp-beginners/thread810541.html
В большинстве интернет-источниках написано, (взять хоть википедию (да, я понимаю, что там много неправильной информации)). Но действительно, если вбить в поиск new c++ почти везде написано, что это оператор. Но ведь это операция?? Или я что то путаю? Или разницы нет? Помогите, я уж совсем запуталась.
C++ Указатель Можете объяснить устройство работы ,мне казалось что если вызвать просто ptr то должен возвратиться адрес,а если * ptr ,то значение,здесь же совершенно все не так int main() { char *ptr="hello world"; cout<<ptr<<endl; cout<<*ptr; getch(); return 0; } http://www.cyberforum.ru/cpp-beginners/thread810537.html
Строковые типы данных C++
Ввести с клавиатуры строку из 20-ти или меньшего числа символов и найти в строке сумму и количество всех цифр. Язык С++(дано: ввод в Edit1 и вывод в Edit2 и Edit3).
C++ Строковые типы данных (заменить все прописные (большие) буквы латинского алфавита строчными (маленькими))
Ввести с клавиатуры строку и заменить все прописные (большие) буквы латинского алфавита строчными (маленькими). Язык С++ (дано Edit1 и вывод в Edit2).
C++ Организовать обход в глубину http://www.cyberforum.ru/cpp-beginners/thread810532.html
Искал код, не смог найти подходящий. Цель следующая - первым обходом ищем все шарниры, а вторым нужно найти для каждого шарнира, на сколько компонент связности дробит граф этот шарнир и сколько в каждой компоненте останется вершин. Было бы вообще великолепно, если бы было возможно реализовать это одним обходом. Поделитесь, пожалуйста, кодом по этому вопросу, или идеями, если есть :)
C++ консольное приложение (при запуске приложение открывалось на весь экран) Как сделать, чтобы при запуске приложение открывалось на весь экран? подробнее

Показать сообщение отдельно
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
16.03.2013, 23:20     Как выглядит изнутри динамическое выделение объекта через 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
39
40
41
42
43
44
45
46
47
48
49
50
51
struct T
{
  int x, y;
};
 
/* Эта процедура является отображением конструктора T::T(int,int) */
void
T_constr (struct T *this, int _x, int _y)
{
  this->x = _x;
  this->y = _y;
}
 
/* Эта процедура является отображением деструктора T::~T() */
void
T_destr (struct T *this)
{
  this->x = 0;
  this->y = 0;
}
...
/* Указатель он и в Африке указатель*/
struct T *ta, *tb;
...
void
func1 (void)
{
  ...
  /* Оператор new одновременно выполняет две вещи:
   * выделение памяти и вызов конструктора */
  ta = (struct T*) malloc (sizeof (struct T));
  T_constr (ta, 10, 11);
  ...
  tb = (struct T*) malloc (sizeof (struct T));
  T_constr (tb, 20, 21);
  ...
}
 
void
func2 (void)
{
  ...
  /* Оператор delete также одновременно выполняет две вещи:
   * вызов деструктора и удаление памяти */
  T_destr (ta);
  free (ta);
  ...
  T_destr (tb);
  free (tb);
  ...
}
А на C++ так :
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
/* Описание класса такое же, как и в предыдущем примере.
 * Я повторяю его, чтобы не нарушить целостность примера. */
class T
{
  private:
    int x, y;
  public:
    T (int _x, int _y) { x = _x; y = _y; }
    /* Смысла в этом деструкторе нет, но пишу его в таком виде, чтобы он был не пустой */
    ~T () { x = 0; y = 0; }
}
...
/* Динамические объекты адресуются указателями и никак больше */
T *ta, *tb;
...
void
func1 (void)
{
  ...
  /* Создаём динамические объекты */
  ta = new T (10, 11);
  ...
  tb = new T (20, 21);
  ...
}
 
void
func2 (void)
{
  ...
  /* Удаляем динамические объекты */
  delete ta;
  ...
  delete tb;
  ...
}
Так вот в Си все понятно, то есть сначала выделяется память с помощью кода "ta = (struct T*) malloc (sizeof (struct T));" , а потом вызывается функция "T_constr" и принимает аргументом указатель на выделенную память. Получается две инструкции, выделения памяти и вызов функции констр.
А теперь вопрос, что происходит в C++? Этапы исполнения этого кода "ta = new T (10, 11);", в принципе знаю, то есть сначала new выделяет память и возвращает адрес, потом запускается конструктор и создает объект в этой памяти или точней инициализирует эту память, дальше указателю присваивается адрес этой памяти. Но как-то это все абстрактно, как это выглядит на самом деле? Допустим new вернула адрес, а что дальше, как выглядит запуск конструктора с этим адресом и как потом этот адрес присваивается указателю "ta" и как это вообще вмещается в одной инструкцие?
Пример кода был взят отсюда
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru