powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Первые четыре байта - указатель на VTABLE
22 сообщений из 22, страница 1 из 1
Первые четыре байта - указатель на VTABLE
    #34828466
Фотография sobolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828510
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ы? А зачем его обнулять?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828514
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolevЗамучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
А кто вам сказал что в первых 4(8) байтах указатель на таблицу виртуальных функций, для некоторых компиляторов это не так
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828518
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за проблема?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828550
Фотография sobolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828569
Фотография sobolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded sobolevЗамучила проблема обнуления указателя на таблицу виртуальных функций.
Кто-нибудь знает хороший метод идентификации того, что первые четыре байта участка памяти - указатель на таблицу виртуальных функций?
Заранее огромное спасибо ответившему.
А кто вам сказал что в первых 4(8) байтах указатель на таблицу виртуальных функций, для некоторых компиляторов это не так
Я про это знаю. Но на текущий момент я пользуюсь тем компилятором, на поведение которого в данном случае готов заложиться (дальше видно будет). В конце концов, я надеюсь решить проблему одним единственным куском кода, зашитым в memzero() (собственный имплемент). Соответственно, портировать такой кусок на любой компилятор или ОС - не проблема.
Так все-таки, идея у кого-нибудь есть?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828571
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не фига-се, вот так структура с виртуальными методами
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828576
daevaorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sobolev
Так все-таки, идея у кого-нибудь есть?
любое решение в данном случае костыль и опасный. поэтому вооружайся контексным поиском и пиши нормальные конструкторы.
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828606
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolev maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.

Компилятор пишете?
А введение конструктра по умолчанию?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34828613
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolev maXmoы? А зачем его обнулять?
Обычная процедура - обнуления структур данных, лишенных конструктора. Однако, некоторые структуры усложняются и получают в навесок VTABLE. Из-за непомерного размера проекта можно не вспомнить где сколько-то лет назад было обнуление экземпляра такой структуры... приехали.

НИКОГДА не обращаться к не POD-данным на низком уровне
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829188
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolev wrote:

> что первые четыре байта участка памяти - указатель на таблицу
> виртуальных функций?
В g++/msvc в первые четыре байта попадает первая объявленная
не-статическая переменная внутри класса.

>Обычная процедура - обнуления структур данных, лишенных конструктора.
Это можно сделать в конструкторе, инициализаторе, и т.д. Зачем вам
доступ к VTABLE? Если у структуры есть VTABLE, лучше сделать ей
нормальный конструктор.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829229
Фотография sobolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV
sobolev wrote:

> что первые четыре байта участка памяти - указатель на таблицу
> виртуальных функций?
В g++/msvc в первые четыре байта попадает первая объявленная
не-статическая переменная внутри класса.

>Обычная процедура - обнуления структур данных, лишенных конструктора.
Это можно сделать в конструкторе, инициализаторе, и т.д. Зачем вам
доступ к VTABLE? Если у структуры есть VTABLE, лучше сделать ей
нормальный конструктор.
Posted via ActualForum NNTP Server 1.4
В msvs первые 4 байта экземпляра класса - указатель на таблицу виртуальных функций, если класс или его предок содержит хоть одну виртуальную функцию, если нет, то см. вашу реплику.
По поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829283
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolev
В msvs первые 4 байта экземпляра класса - указатель на таблицу виртуальных функций, если класс или его предок содержит хоть одну виртуальную функцию, если нет, то см. вашу реплику.
По поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.
Ну ежели кому хочется убиться, то чегоже не помочь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
struct Eve // праматерь все богов
{
};

struct MyStruct : public Eve
{
  virtual ~MuStruct() {}
};

struct HisStruct : public Eve
{
  int a;
}

template <class S>
void memzero(S* ptr)
{
  memset(static_cast<Eve*>(ptr),  0 , sizeof(S) - (ptr - static_cast<Eve*>(ptr));
}

...
MyStruct ms;
memzero(ms);
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829475
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
ptr - static_cast<Eve*>(ptr)
наоборот
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829478
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolevПо поводу второй части вашей реплики, мне кажется, я дал исчерпывающее объяснение выше.отсутствие отладчика не упомянуто.
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829486
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sobolev wrote:
> В msvs первые 4 байта экземпляра класса
Ошибался, признаю. Только что протестил.

Код: plaintext
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>

class A{
public:
    virtual void a(){
        printf("ы\n");
    }
    virtual ~A(){
    }
};

class B: public A{
protected:
    int i;
public:
    B(){i =  1234 ;}
};


int main (int argc, char** argv){
    B b;
    printf("%d\n", *((int*)&b));
    return  0 ;
}

Выводит 134514792

Только у меня g++, и все равно не получится опознать, есть ли в начале
указатель на таблицу методов или мусор. Если данные не
инициализированы, то нельзя проверить, указатель ли это на таблицу или
рандомный мусор (хотя в отладочном режиме в неинициализированных данных
MSVC хранится 0xCCCCCCCC, для релиза это не работает).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829514
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVОшибался, признаю. Только что протестил.ну приехали, а COM–компоненты каким компилятором компилятся?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829520
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVТолько у меня g++, и все равно не получится опознать, есть ли в начале
указатель на таблицу методов или мусор. Если данные не
инициализированы, то нельзя проверить, указатель ли это на таблицу или
рандомный мусор (хотя в отладочном режиме в неинициализированных данных
MSVC хранится 0xCCCCCCCC, для релиза это не работает).можно попробовать сравнить указатель на функцию с соответствующим ей значением из vtbl
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829537
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo
Код: plaintext
ptr - static_cast<Eve*>(ptr)
наоборот
А вот и нет, там вообще надо abs(ptr - static_cast<Eve*>(ptr)) чтобы и на хипе и на стеке попасть
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34829696
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo wrote:

> ну приехали, а COM?компоненты каким компилятором компилятся?
Я не это имел в виду.
Я ранее написал, что вначале идут поля данных, а затем vtbl.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34831358
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedчтобы и на хипе и на стеке попастьа эти случаи чем-то отличаются?
...
Рейтинг: 0 / 0
Первые четыре байта - указатель на VTABLE
    #34831960
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не-а, просто облажался
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Первые четыре байта - указатель на VTABLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]