Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 390
1

Как реализовать вызов деструктора в lua api?

06.03.2019, 19:09. Показов 992. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте всем. У меня есть вопрос, получилось в lua api c++ реализовать ООП. Вызов функции возвращает указатель на объект класса. Мы можем этот указатель передать в функцию, чтобы вызывать его метод, но существует одна проблема: сборщик мусора не вызывает деструктор, поэтому происходит утечка памяти. Помогите реализовать вызов деструктора в lua api c++.

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
struct a {
    int x = 10;
    a() { cout << "create object " << this << endl; }//конструктор по умолчанию
 
    void show() { cout << "\nobject - " << this << "\tx = " << x <<"\n\n"; }//вывести значение x на экран.
 
    ~a() { cout << "destory object " << this << endl << endl; }//вызов деструктора.
};
 
int create(lua_State* L) {//    Функция создания объекта структуры.
    a** c = (a**)lua_newuserdata(L, sizeof(a*));/*Эта функция выделяет новый блок памяти с заданным размером,*/
    *c = new a();
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
    lua_setmetatable(L, -1); //получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
 
return 1;
};
int show(lua_State* L) {
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
 
    a** st = (a**)lua_touserdata(L, -2);// получаем польз. данные.
    a *b = &**st;
    b->show();// вызов метода.
    return 0;
};
 
int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
    a* b = (a*)lua_touserdata(L, -2); // получаем польз. данные.
    b->~a();//вызов метода деструктор.
    delete b;
    return 0;
};
 
int main() {
    lua_State* L = luaL_newstate();
    lua_register(L, "create", create );//уст указатель на функцию C++ и создает внутри Lua
    lua_register(L, "show", show); //получает значение из стека и уст значение global name.
    lua_register(L, "__gc", destroy); //получает значение из стека и уст значение global name.
    luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
 
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
    return 0;
}
lua
C++
1
2
a1 = create()
show(a1)
Выводится
create object 0062B020

object - 0062B020 x = 10
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2019, 19:09
Ответы с готовыми решениями:

Вызов деструктора в Lua Bridge
Здравствуйте, всем. пишу класс в LuaBridge. скажите, как правильно вызвать деструктор. ...

Скажите, пожалуйста, как правильно реализовать работу методов класса в lua api c++
вот самая простая структура. как вызвать ее конструктор и метод в lua. Подскажите, пожалуйста. ...

Вызов деструктора
При ручном вызове деструктора, освобождается ли память*

Вызов деструктора
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo...

1
11 / 10 / 2
Регистрация: 19.02.2018
Сообщений: 390
08.03.2019, 15:02  [ТС] 2
вот решил, так.

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
struct a {
    int x = 10;
    a() { cout << "create object " << this << endl; }//конструктор по умолчанию
 
    void show() { cout << "\nobject - " << this << "\tx = " << x <<"\n\n"; }//вывести значение x на экран.
 
    ~a() { cout << "destory object " << this << endl << endl; }//вызов деструктора.
};
 
int destroy(lua_State* L) {// Функция вызывает деструктор для объекта.
    cout << "destroy " << endl;
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
    a** st = (a**)lua_touserdata(L, -2); // получаем польз. данные.
    a *b = &**st;
    b->~a();//вызов метода деструктор.
    //delete b;
    return 0;
 
};
int create(lua_State* L) {//    Функция создания объекта структуры.
    luaL_newmetatable(L, "mt");// создать мета таблицу.
    lua_pushstring(L, "__gc");// отправить в стек сборщик мусора.
    lua_pushcfunction(L, destroy);// установить значение ключа, как вызов деструктор.
 
    lua_settable(L, -3);// установить таблицу.
    a** c = (a**)lua_newuserdata(L, sizeof(a*));/*Эта функция выделяет новый блок памяти с заданным размером,*/
    *c = new a();
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
 
    lua_setmetatable(L, -2); //получает таблицу из стека и уст ее в качестве новой метатаблицы для значения с заданным допустимым индексом.
 
return 1;
};
int show(lua_State* L) {
    luaL_getmetatable(L, "mt"); /* отправляет в стек метатаблицу значения при заданном приемлемом индексе.*/
    a** st = (a**)lua_touserdata(L, -2);// получаем польз. данные.
    a *b = &**st;
    b->show();// вызов метода.   
    return 0;
};
 
int main() {
    lua_State* L = luaL_newstate();
    lua_register(L, "create", create );//уст указатель на функцию C++ и создает внутри Lua
    lua_register(L, "show", show); //получает значение из стека и уст значение global name.
    lua_register(L, "__gc", destroy); //получает значение из стека и уст значение global name.
    luaL_dofile(L, "main.lua");// Загружает и запускает заданный файл. файл в которым все происходит.
 
    lua_close(L);// закрыть состояние
    cin.get();//ожидает ввода символа программа завершается.
    return 0;
}
выводится.


create object 0123A608

object - 0123A608 x = 10

destroy
destory object 0123A608
0
08.03.2019, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2019, 15:02
Помогаю со студенческими работами здесь

Вызов деструктора
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки....

Вызов деструктора
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять...

Вызов деструктора
Здравствуйте ,подскажите пожалуйста ,есть вот такой код ... При создании объекта MyClass в...

Явный вызов деструктора
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru