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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как узнать, какой функции какой файл *.a соответсвует? http://www.cyberforum.ru/cpp/thread446938.html
Друзья! Работаю с mingw, вот там надо так: если, допустим, вызываешь API- функцию, то надо подключать соответствующую библиотеку (?), делается это ключом линкёра примерно так: -lwww файл Эта команда значит, что libwww.a, находящийся в папке lib, подключится к проекту и что это значит Я НЕ ЗНАЮ. Да и честно говоря, как программиста приложений меня не должно это волновать. Но иногда я не...
C++ Про деструктор и утечку памяти Доброе время суток. Вот что дано: #include <string> #include <vector> class Symbols { protected: void add(std::string str); // добавления символа virtual void inputData() = 0; // заполнение вектора data нужными символами http://www.cyberforum.ru/cpp/thread446749.html
Создать exe, запускающий exe C++
Говорю сразу: я ничего не смыслю в програмировании; зачем подался на такой форум? Надеюсь получить ответ на свой вопрос,упавая на то, что его реализация не такая сложная. У меня возникла потребность, создать exe файл, который запускает другую программу. То есть: просто тупо играет роль посредника. Другими словами: что-то наподобие ярлыка, только exe , а не lnk. Существует ли решение...
Странное поведение bool C++
Помогал отлаживать код и мы наткнулись на удивительное. Кодер скрыл отображение варнингов в VS2010. Метод М1 не всегда возвращал значение типа bool. И потому в методе М2, вызывающем метод М1, случилась такая ситуация, что: M1()!=true & M1()!=false Это нормальное поведение компилятора? Логика то понятна, но почему это вообще варнинг, а не еррор как в си шарпе?
C++ Как средствами BC 3,1 запросить свободное место на указанном жёстком диске? http://www.cyberforum.ru/cpp/thread444851.html
Извиняюсь, если создал лишнюю тему, но ничего по своей проблемке я вроде не заметил. Если что-то есть, поправьте. А вопрос в следующем: как средствами BC 3,1 запросить свободное место на указанном жёстком диске?
C++ Указания адреса функции Есть библиотека. Нужно чтобы функция в моей библиотеке указывала на функцию в чужой. Вот мой код: typedef int (WINAPI WJMP)(); extern "C" __declspec(dllexport) WJMP Test(void); *Test= GetProcAddress(hLib, "Test"); Ошибки 1. error C2091: функция возвращает функцию подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
17530 / 5768 / 368
Регистрация: 30.03.2009
Сообщений: 15,859
Записей в блоге: 26
16.02.2012, 15:46     [C++] Взятие адреса конструктора. Физическое время существование объекта.
В личке ты вопрос ставил по другому. Просто сейчас повторю твой вопрос и ответ, который я написал, но не смог отправить. Если после этого тебе до сих пор не станет ясен ответ на вопрос 2 (уже из данной темы) - скажи. Про первый вопрос, как я уже писал, я вопроса не понял

Вопрос N2, как он был задан в личке

второй момент на который хотелось бы твоих комментариев. время жизни авто переменных.
каково оно? много раз написано на форуме что после выхода из области видимости и при отсутствии след вызовов - данные лежат нетронутыми. вопрос, какое количество последующих вызовов должно произойти чтобы данные затерлись, если данные эти - поля временного класса А, который создан и сразу уничтожен вначале моего письма.

Ответ

Я не знаю, насколько ты знаком с устройством файловой системы. Когда ты удаляешь файл на диске, то ты потом его можешь восставновить (если повезёт). Происходит это потому, что файл, как логическая сущность, из файловой системы на логическом уровне удаляется. Но физическое содержимое физического диска остаётся не тронутым. Удаляется только запись о том, что такой-то файл присуствует (именно поэтому после восстановления файлов у них нельзя восстановить оригинальное имя), но содержимое файла на диске остаётся, хотя это место отмечено как свободное. Если после удаления файла создать другой файл, то есть вероятность того, что данные от нового файла попадут на те же саме физические области физического диска и перетрут их (и тогда старый файл уже нельзя будет восстановить).

С твоим вопросом про объекты - то же самое. Логическое время жизни автоматического объекта (которое гарантировано стандартом) - это от точки его объявления до закрывающей фигурной скобки в том блоке, в котором объявлена переменная. После того, как перешли закрывающую скобку, логичеси объект существовать перестаёт. Но содержимое объекта физически находится в той области памяти, где существовал объект. Если эта область памяти затем кем-то переиспользуется, то данные от объекта навечно утеряны, если память ещё не успела поиспользоваться, то физически сами данные можно получить

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
#include <stdio.h>
 
int func1 (void)
{
  int a[10];
  a[7] = 0x11111111;
  return a[7];
}
 
int func2 (void)
{
  int b[10];
  /* Используем неинициализированные данные */
  return b[7];
}
 
int main (void)
{
  int x, y;
 
  x = func1();
  y = func2();
  printf ("%x %x\n", x, y);
  return 0;
}
Конкретно в данном случае при использовании конкретно gcc получилось так, что после завершения работы func1 память, в которой лежал массив "a", физически больше не переписывалась и не переиспользовалась. При входе в функцию func2 массив "b" попал в ту же самую память, где находился массив "a", а потому читая неинициализированное значение, мы на самом деле прочитали данные, которые когда-то соответсвовали массиву "a". И потому, читая b[7], прочитали то же значение, что было когда-то записано в a[7]

Ответ на вопрос "какое количество последующих вызовов должно произойти чтобы данные затерлись" нельзя дать однозначно. Это зависит от каждого конкретного случая и от того, каким образом компилятор распорядится стеком. Даные затрутся в тот момент, когда активация текущей функции наложится на интересующий тебя участок памяти и когда компилятор построит записи в эту память. В моём примере активации стека наложились, но в func2 из этой памяти я только читал, но не писал.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru