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

Надзиратель томагавков или что за велосипед я изобрел? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Получение из файла формата wav массива значений http://www.cyberforum.ru/cpp/thread1108824.html
Столкнулся со следующей задачей, требуется получить из wav файла массив значений. Сам владею Си на примитивном уровне, по этой причине решить данную задачу самостоятельно не могу, поиск в гугле ничего не дал (или просто я не увидел решения). Надеюсь на вашу помощь.
C++ Run exe from memory (x64) Есть необходимость запускать exe из памяти, а не с диска. Может кто сталкивался с данным проектом? Сам находил много проектов, но они были Win32 и не работали под сборкой x64. А мне нужен именно x64, так как это проект будет использоваться в связки с другими 64-битными проектами. http://www.cyberforum.ru/cpp/thread1107701.html
Я по по воду хакерства.В последнее время это меня очень сильно заинтересовало может посоветуете чего нибудь(книги,программы и тд ) буду очень благодар C++
Прошу прощения , но я не нашел подходящей темы и решил написать сюда т.к. единственное что я знаю это С++ и то плоховато)) вы наверное подумаете " еще один про хакер"
Как с помощью Bitblt нарисовать линию из '*'? C++
как с помощью Bitblt нарисовать линию из таких символов *?
C++ Как должен выглядеть POST и GET запросы к нужному ресурсу? http://www.cyberforum.ru/cpp/thread1107077.html
Всем привет! Пишу приложение, используя библиотеку cURL и застрял на том, что не могу определить как должен выглядеть POST и GET запрос к нужному ресурсу? Как это определять? P.S. Правильно ли я понимаю (в общих чертах), что POST запрос нужно формировать для авторизации (получение куков), после чего GET запросами мы переходим по директории ресурса?
C++ Необходимо дописать программу Здравствуйте. Нужна помощь в написании программы, точнее её частичном изменении. Вот исходники программы. На картинке изобразил, что хотелось бы получить в итоге: подробнее

Показать сообщение отдельно
SatanaXIII
Супер-модератор
Эксперт С++
5591 / 2625 / 239
Регистрация: 01.11.2011
Сообщений: 6,455
Завершенные тесты: 1

Надзиратель томагавков или что за велосипед я изобрел? - C++

03.03.2014, 11:29. Просмотров 505. Ответов 2
Метки (Все метки)

Название: She2.jpg
Просмотров: 88

Размер: 10.5 Кб
She's alive!

Господа, в общем вдохновился я темой programina про статические поля класса и решил создать что-то похожее на сборщик мусора. По скольку я придерживаюсь мнения, что порою лучше сперва самому поковыряться, а потом уже почитать как правильно надо было сделать, то вот такой у меня получился уродец.

Долго думал куда можно его применить в качестве примера. Придумал - класс-томагавк. Смысл в чем: какая-нибудь гипотетическая игрушка, где индеец бросает томагавки. Функция main тут имитирует само интерактивное бросание неизвестного количества томагавков. При каждом броске создается отдельный экземпляр класса томагавк, содержащий какие-либо свойства и методы (как он будет там вращаться, с какой скоростью лететь в разных средах, материал, цвет и прочее). Для примера реализован только один - первоначальное направление броска. То есть запустили его и забыли. Как они там куда повтыкались и куда улетели нас не волнует. Главное - подчистить память за ними при выходе из функции (к примеру, при переходе на новую локацию).

В голову пришло использовать автоматический вызов деструктора по выходу из области видимости: создается один экземпляр класса на стеке - надзиратель - и как-то помечается. Остальные рабочие классы-томагавки создаются в куче (собственно по этому и надо за ними следить). Надзирателю доступны методы работы со всеми экземплярами, а рабочим только с самими собой. (Надзирателей может быть несколько)

Вооот. Реализация класса следующая (все вроде постарался расписать в комментариях):

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
class Tomagavk
{
 
public:
        Tomagavk():isOverseer( false )
                  {
                     countTomagavkLink.push_back( this );
                   };
        Tomagavk( bool isOverseer_ ):isOverseer( isOverseer_ )
                  {
                     // Здесь можно вставить проверку на создание только одного надзирателя. Если нужно
                     countTomagavkLink.push_back( this );
                   };
        ~Tomagavk(){
                    countTomagavkLink.erase(
                                      find( countTomagavkLink.begin(), countTomagavkLink.end(), this )
                                            );
 
                    if( this->isOverseer )     //// Автоматическая чистка при уничтожени надзирателя
                      {                        ////  При нескольких надзирателях тоже сработает
                      TerminateAllTomagavk();
                      cout << "Overseer is dead" << endl;
                      cin.ignore();
                      }
                    };
 
 
private:
        const bool isOverseer;
        static vector<Tomagavk *> countTomagavkLink; // Собственно сама считалка ////////////////
//------                                           ----------------------------------------------
private:                                           //// Какие-то полезные члены
        int way;                                     //
public:                                              //
        const int GetWay(){ return way; }            //
        void SetWay( int way_ ){ way = way_; }     ////
//------                                           ----------------------------------------------
public:                                            //// Общие методы. Для всех экземпляров
        void ShowItems(){
                        if( this->isOverseer )
                          for( vector<Tomagavk *>::iterator it = countTomagavkLink.begin();
                               it!=countTomagavkLink.end();
                               ++it )
                               {
                               cout << (*it)->GetWay() << endl;
                               }
                        cout << endl;
                        }
        bool TerminateAllTomagavk()
                        {
                        if( this->isOverseer )
                          for( vector<Tomagavk *>::iterator it = countTomagavkLink.begin();
                               it!=countTomagavkLink.end();
                               ++it )
                               {
                               if( !(*it)->isOverseer ) // Надзирателей не удаляем
                                 {
                                 (*it)->~Tomagavk(); // delete *it;
                                 --it;
                                 }
                               }
                        else
                          return false;
 
                        return true;
                        }
 
        //friend int main(); // Без этого никто не получит доступа к статичному полю
};
//---------------------------------------------------------------------------
vector<Tomagavk *> Tomagavk::countTomagavkLink; // Считалка обязательно должена быть объявлена //
                                                //  глобальной, чтобы не затиралась каждый раз
                                                //  при создании нового экземпляра класса
//---------------------------------------------------------------------------
 
int main()
{
Tomagavk overseer( true ); // Надзиратель томагавочный
                           // Только ему разрешено пользоваться общими функциями
                           //  так как он создан на стеке
                           // Контроль на программисте
 
 
Tomagavk *tom1 = new Tomagavk();    tom1->SetWay(11);     //// Создали
Tomagavk *tom2 = new Tomagavk();    tom2->SetWay(22);       //
Tomagavk *tom3 = new Tomagavk();    tom3->SetWay(33);     ////
 
overseer.ShowItems(); // Можно поглядеть, что на данный момент создано
 
//delete tom3;                                            //// Удалили какие-то
delete tom2;                                                //
//delete tom1;                                            ////
 
overseer.ShowItems(); // Можно поглядеть, что осталось
 
//tom2->ShowItems(); // А вот здесь косяк - после удаления экземпляра,
                     //  закрытый метод для него становится доступным
                     // Это связано со свойством isOverseer
                     // при удалении экземпляра оно становится равным true
                     // Если его инвертировать, то все в порядке
 
 
overseer.TerminateAllTomagavk();                        //// Подчистили
 
overseer.ShowItems(); // Проверили
 
//cout << Tomogavk::countTomagavkLink.size() << endl; // Если б main была friend, то сработало бы
 
cin.ignore();
return 0;
} // Надзиратель уничтожился (так же вызовется overseer.TerminateAllTomogavk() для всех неподчищеных хвостов)
  // В памяти остался только пустой вектор,
  //  который и будет задействован в случае создании еще экземпляров


Итак. Возникли следующие вопросы:
1) Что это за хрень? Х) Что-то среднее между сборщиком мусора и умным указателем?
2) Как вообще сама идея использовать подобным образом автоматический вызов деструктора для объекта, созданного на стеке, чтобы управлять созданными динамически?
3) Куда это можно применить?
4) Можно ли как-то узнать где именно создан конкретный объект - на стеке или в куче?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru