Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Как узнать, какой функции какой файл *.a соответсвует? Друзья! Работаю с mingw, вот там надо так: если, допустим, вызываешь API- функцию, то надо подключать соответствующую библиотеку (?), делается это ключом линкёра примерно так: -lwww файл Эта команда значит, что libwww.a, находящийся в папке lib, подключится к проекту и что это значит Я НЕ ЗНАЮ. Да и честно говоря, как программиста приложений меня не должно это волновать. Но иногда я не... https://www.cyberforum.ru/ cpp/ thread446938.html Про деструктор и утечку памяти C++
Доброе время суток. Вот что дано: #include <string> #include <vector> class Symbols { protected: void add(std::string str); // добавления символа virtual void inputData() = 0; // заполнение вектора data нужными символами
C++ Создать exe, запускающий exe https://www.cyberforum.ru/ cpp/ thread446459.html
Говорю сразу: я ничего не смыслю в програмировании; зачем подался на такой форум? Надеюсь получить ответ на свой вопрос,упавая на то, что его реализация не такая сложная. У меня возникла потребность, создать exe файл, который запускает другую программу. То есть: просто тупо играет роль посредника. Другими словами: что-то наподобие ярлыка, только exe , а не lnk. Существует ли решение...
C++ Странное поведение bool https://www.cyberforum.ru/ cpp/ thread445695.html
Помогал отлаживать код и мы наткнулись на удивительное. Кодер скрыл отображение варнингов в VS2010. Метод М1 не всегда возвращал значение типа bool. И потому в методе М2, вызывающем метод М1, случилась такая ситуация, что: M1()!=true & M1()!=false Это нормальное поведение компилятора? Логика то понятна, но почему это вообще варнинг, а не еррор как в си шарпе?
Как средствами BC 3,1 запросить свободное место на указанном жёстком диске? C++
Извиняюсь, если создал лишнюю тему, но ничего по своей проблемке я вроде не заметил. Если что-то есть, поправьте. А вопрос в следующем: как средствами BC 3,1 запросить свободное место на указанном жёстком диске?
C++ Указания адреса функции Есть библиотека. Нужно чтобы функция в моей библиотеке указывала на функцию в чужой. Вот мой код: typedef int (WINAPI WJMP)(); extern "C" __declspec(dllexport) WJMP Test(void); *Test= GetProcAddress(hLib, "Test"); Ошибки 1. error C2091: функция возвращает функцию https://www.cyberforum.ru/ cpp/ thread444782.html
C++ Как аннулировать потоки, которые заблокированы по переменной условия (pthread)? И никак, что ли не аннулировать, получается? Вот, допустим, есть несколько потоков которые заблокированы по переменной условия: pthread_mutex_lock (&mutex); if (!(mozno_idti)) { pthread_cond_wait(&cond, &mutex); } pthread_mutex_unlock (&mutex); https://www.cyberforum.ru/ cpp/ thread444520.html Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) C++
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой TID. После первого вывода TIDа каждым потоком срабатывает блокировка барьером. Ну то есть свсе потоки по разу выведут свой TID и ждут друг друга. После того, как все собрались, в вызывающий поток отправляется сигнал типа:"Мы собрались" (потоки пока не двигаются)....
C++ Внедрение мультиплеера C++ Привет дорогие форумчане. Возникла задача сделать мультиплеер для игры(исходных кодов которой я не имею) . Разбил на задачки и вот одна из них. Первая задача это перемещение игроков. вот моя идея. Нужно получить координаты одного игрока(P1) (x,y,z) передать на сервер,сервер передает всем остальным игрокам координаты P1(x,y,z). с этим я разобрался. теперь вопрос в другом ,как обработать... https://www.cyberforum.ru/ cpp/ thread443994.html C++ Графический интерфейс приложений на C? https://www.cyberforum.ru/ cpp/ thread443785.html
Как сделать графический интерфейс приложения под Linux написанного на C?
C++ Ненулевая масса статического объекта в Box2D
Собственно как реализовать сабж?
C++ callback функция https://www.cyberforum.ru/ cpp/ thread443741.html
Здраствуйте!!! Занимаюсь разработкой снифера под DVB-карту. Пытаюсь получить MPEG-поток. Проблема заключается в том, что необходимо фрагментировать поток. При вызове функции установки сигнала вызывается callback-функция, которая записывает поток в файл. Как досрочно выйти из callback-функции. Она полностью захватывает поток и его нельзя фрагментировать. Кто знает, напишите свои...
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
17.02.2012, 12:53 0

[C++] Взятие адреса конструктора. Физическое время существование объекта. - C++ - Ответ 2498746

17.02.2012, 12:53. Показов 13259. Ответов 69
Метки (Все метки)

Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
и теоретически мы можем вызвать конструктор, поскольку он является обычной функцией найдя его адрес в загруженном в память файле. верно?
По поводу того, как читерскими способами (т.е. неязыковыми средствами) вызвать конструктор

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
#include <stdio.h>
 
class A
{
    int a;
  public:
    A (int);
};
 
void func (void)
{
}
 
A::A (int x) : a(55555555 + x)
{
}
 
long delta = 0;
 
int main (void)
{
  /* Читерская структура, которая соотвествует классу A */
  struct s
  {
    int x;
  };
 
  /* Читерская переменная, которую подсунем в конструктор в качестве
   * экземпляра класса A */
  struct s str;
  str.x = 0;
 
  /* Читерский прототип функции, который соответсвует конструктору A::A(int) */
  typedef void (*fptr_t) (struct s*, int);
 
  /* Адрес подставной функции func */
  long addr = (long) &func;
 
  /* Вычисляем адрес конструктора, предполагая, что компилятор расположит его
  * в памяти сразу после функции func */
  addr += delta;
 
  /* Читерским образом вызываем конструктор */
  ((fptr_t)addr) (&str, 1);
 
  /* для контроля проверим, что читерский объект действительно должным
   * образом проинициализирован */
  printf ("str.x=%d\n", str.x);
 
  return 0;
}
Мы здесь основываемся на том, что через адрес функции func мы сможем вычислить адрес конструктора (т.к. в памяти они будут лежать рядом по статическим адресам). Поскольку средствами языка нельзя взять адрес на конструктор, то мы это можем сделать, анализируя исполняемый файл. Пример я запускал на linux'е (оно покатит и на любом unix'е). Под виндой запускать ровно таким же образом, если кто-то знает, как там смотреть символьную таблицу исполняемого файла

Сначала делаем предварительный запуск с целью выяснения адреса

Код
$ g++ t.cc -fno-exceptions -O2
$ readelf --symbol a.out | grep FUNC
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
    44: 08048400     5 FUNC    GLOBAL DEFAULT   13 _Z4funcv
    47: 08048430    19 FUNC    GLOBAL DEFAULT   13 _ZN1AC1Ei
...
Метка _Z4funcv соответствует нашей функции func, метка _ZN1AC1Ei соответствует конструктору A::A(int). Во второй колонке написаны адреса этих функций (по научному Value). Вычисляем разницу адресов 0x08048430 - 0x08048400 = 0x30, а затем модифицируем программу, заменив "long delta = 0;" на "long delta = 0x30;". И далее запускаем:

Код
$ g++ t.cc -fno-exceptions -O2
$ ./a.out
str.x=55555556
Следует понимать, что в обоих случаях надо производить запуск компилятора с одними и теми же опциями, чтобы гарантировать одинаковость сгенерированного кода. В моём случае разница адресов получилась 0x30, но на каждой отдельной машине (на которой стоит своя версия компилятора) эта разница будет своя. Здесь я опираюсь на то, что компилятор gcc строит метод функции таким образом, как если бы эта была функция с скрытым первым параметром. Другие компиляторы, к пример, вправе поступать подругому, вправе изменять программные соглашения по передаче параметров в методы класса и т.п. Я здесь всего лишь показал, что технически это возможно, нужно только знать, как это делать

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
или просто отдаст 3 регистра (будет сие означать выделение памяти)???
Будет. Строго говоря, вместо "выделение памяти" правильным будет назвать "выделение аппаратного ресурса", что есть память либо регистр. Но сточки зрения понимания вопроса это непринципиально. Людям удобнее оперировать понятием "память" и не заморачиваться тем, что ещё есть "регситр". В режиме без оптимизаций основная масса компиляторов все переменные складывает в память, и для экспериментов этого вполне достаточно

Вернуться к обсуждению:
[C++] Взятие адреса конструктора. Физическое время существование объекта. C++
4
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2012, 12:53
Готовые ответы и решения:

Взятие значение из адреса
Имеется код добавления объекта &quot;точка&quot; в массив точек: void arr_point::add_point(point &amp;p) {...

Взятие адреса в аргументе
Есть такой код: void STOCK::acquiare(const std::string &amp;co,long n, double pr) { ...

Взятие адреса у константной переменной при объявлении
Можно пример?

Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Доброго времени суток. Очень часто наблюдаю во всевозможных примерах такого вида код: void* bits...

69
17.02.2012, 12:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2012, 12:53
Помогаю со студенческими работами здесь

Проверка URL адреса на существование
Доброго времени суток! Есть определенный цикл по перебору страниц сайта, цикл определяет...

Проверка email адреса на существование
Доброго времени суток. Есть надобность в небольшой программе. Суть в том что после ввода email...

Проверка на существование proxy адреса
Добрый день У меня такой вопрос Каким кодом я могу осуществить проверку на существование proxy...

Файлы: ввод адреса объекта и вывод данных объекта
Всем привет. Хочу сделать программу, в консоль которой, вводится адрес папки/файла, после чего,...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru