Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Когда можно попасть в нестатическую функцию класса, когда переменные класса не созданы? 
:(
    Опции темы
Nuzur
Дата 22.9.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5




Глупая ситуация, и вопрос странно звучит, но все же. Короче я вызываю функцию класса  и попадаю дебагерром но в теле функции идет присваивание переменной члену класса и сия переменная имеет адрес ниже 0хFF тоусть 0х0000004С например и ессено когда ей идет присваивание я получаю Access Violation и все валится.

Внимание вопрос.
Когда возможна такая ситуация что б я попал в телео функции класса а переменные класса не были созданы smile


--------------------
Never again...
PM MAIL   Вверх
Bogdan1024
Дата 22.9.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: нет
Всего: 13



Когда ты не создал эти самые переменные smile А что за переменные?


--------------------
user posted image
PM MAIL   Вверх
CaptainFlint
Дата 22.9.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: нет
Всего: 23



Цитата(Nuzur @  22.9.2006,  11:31 Найти цитируемый пост)
Когда возможна такая ситуация что б я попал в телео функции класса а переменные класса не были созданы

1. Если, например, создавался базовый класс, а потом указатель был тупо приведён к типу наследника.
Хотя не, тут я соврал. Переменные наследника в таком случае не могли бы иметь адрес меньше, чем адрес начала объекта класса. Что, разумеется, никоим образом не относится к случаю, когда переменная является указателем и содержит адрес 0x0000004C. smile

2. Скомпилить и запустить:
Код
class A
{
public:
    void f() {printf("this == %p\n", this);}
};

int main(int argc, char* argv[])
{
    ((A*)(NULL))->f();
    return 0;
}

Я когда об этом узнал, сильно удивился. smile

3. Может быть, что-то ещё...

Это сообщение отредактировал(а) CaptainFlint - 22.9.2006, 11:06


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
Nuzur
Дата 22.9.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



CaptainFlint, Нет не указатель, например CString а секции private.
Классы действительно приводятся но там через CRuntimeClass  и приводятся потом назад, там должно быть все чин-чинарем.

2. Млин я тоже удивился невероятно!
Но адрес this там не нулевой а абсолютно нормальный, я про свою ситуацию. А вот адрес того же стринга... подкачал короче.

И вот так вот похожая ситуация, но ведь адрес у this в моем случаи нормальный!
Код

class A
{
public:
    int x;

    void f()
    {
        TRACE("this == %p\n", this);
        x = 1; //Access Violation или если его убрать то тут 
        TRACE("X == %n\n", x); //Access Violation
    }
};

void main() 
{
   ((A*)(NULL))->f();
}


3. Видимо так и есть


--------------------
Never again...
PM MAIL   Вверх
Rockie
Дата 22.9.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата
 x = 1; //Access Violation или если его убрать то тут 
        TRACE("X == %n\n", x); //Access Violation

Ну вроде и правильно. Обьект же не создан. 
Код
#include<iostream>

using namespace std;

class A
{
public:
    int x;

    void f()
    {
        printf("this == %p\n", this);
        x = 1; 
        printf("X == %d\n", x); 
    }
};

void main()
{  A a;
   a.f();
}



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
MAKCim
Дата 22.9.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Я когда об этом узнал, сильно удивился. 

Ничего удивительного
Методы - это одно, а поля - совсем другое - для них нужно память выделять (в стеке или в дин. памяти)
Цитата

Код

class A
{
public:
    int x;
    void f()
    {
        TRACE("this == %p\n", this);
        x = 1; // Адрес this будет в большинстве случаев невалидный, отсюда ошибка
        TRACE("X == %n\n", x);
    }
};
void main() 
{
   ((A*)(NULL))->f();
}




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
albertn
Дата 22.9.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: нет
Всего: 34



Такое еще может быть, если объект уже был уничтожен.
PM WWW ICQ   Вверх
Nuzur
Дата 25.9.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



Объкт был создан. В чем еще может быть загвоздка?


--------------------
Never again...
PM MAIL   Вверх
Rockie
Дата 25.9.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Nuzur @  25.9.2006,  10:46 Найти цитируемый пост)
Объкт был создан. В чем еще может быть загвоздка?

Цитата(Nuzur @  22.9.2006,  12:53 Найти цитируемый пост)
   TRACE("X == %n\n", x); //Access Violation

%n вместо %d? Или что за загвоздка?





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
sergejzr
Дата 25.9.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Код в студию!
Обьекта нет. Это единственное обьяснение подобному.

Добавлено @ 12:55 
Или обьект уже деструктирован, либо никогда не был создан. Скорее всего первое. 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.