Форум программистов, компьютерный форум 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++ консольное приложение (при запуске приложение открывалось на весь экран) Как сделать, чтобы при запуске приложение открывалось на весь экран? подробнее

Показать сообщение отдельно
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
17.03.2013, 00:57     Как выглядит изнутри динамическое выделение объекта через new?
Цитата Сообщение от mzarb Посмотреть сообщение
Но ладно, в будущем ещё доберусь до этой темы уже с асмом в арсенале.
да я тебе счас скину прокоментирую как смогу

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
class A
{
public:
    int a;
    A(){a=0;};
    virtual ~A(){};// виртуальность нужна чтобы вызвался конструктор, иначе оптимизатор может его выбросить 
};
 
 
//unsigned long int array[100000];
int main()
{
 A* a=new A;
 cout<<a->a;
 delete a;
 return 0;
}

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
              call    j_??2@YAPAXI@Z  ;      operator new(uint)вот вызывается new
.text:0043CD04                 add     esp, 4
.text:0043CD07                 mov     [ebp+this], eax; здесь записаваем в переменную
.text:0043CD0D                 mov     [ebp+var_4], 0
.text:0043CD14                 cmp     [ebp+this], 0 ; если new вернул ноль то идем к ветке где в указатель запишется 0
.text:0043CD1B                 jz      short loc_43CD30
.text:0043CD1D                 mov     ecx, [ebp+this] ; this
.text:0043CD23                 call    j_??0A@@QAE@XZ  ; A::A(void) ; иначе вызываем конструктор
.text:0043CD28                 mov     [ebp+var_10C], eax ; в указатель запишем экземпляр класса
.text:0043CD2E                 jmp     short loc_43CD3A
.text:0043CD30 ; ---------------------------------------------------------------------------
.text:0043CD30
.text:0043CD30 loc_43CD30:                             ; CODE XREF: _main+5Bj
.text:0043CD30                 mov     [ebp+var_10C], 0  ; вот здесь в указатель пишем 0 
                                                     ;это для того чтобы любое обращение вызвало исключение 
.text:0043CD3A
.text:0043CD3A loc_43CD3A:                             ; CODE XREF: _main+6Ej
.text:0043CD3A                 mov     eax, [ebp+var_10C]; вот здесь начинаем работать с классом
 
Текущее время: 08:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru