Я пытаюсь копировать деструкторы и конструкторы C ++ в моем c-программировании. Это означает, что для каждого объекта или структуры есть функция инициализации и функция уничтожения, которая освобождает все ресурсы объектов следующим образом:
struct MyObject {
struct string a;
struct string b;
struct string c;
};
ConstructMyObject(struct MyObject *obj) {
ConstructString(&obj->a);
ConstructString(&obj->b);
ConstructString(&obj->c);
}
DestructMyObject(struct MyObject *obj) {
DestructString(&obj->a);
DestructString(&obj->b);
DestructString(&obj->c);
}
Функция уничтожения вызывается в конце каждой области действия функции, как вC ++ только то, что я положил его там вручную. Поэтому теперь в функции DestructMyObject я вызываю деструкторы каждого типа struct string
, потому что для объекта struct string
у меня также будет функция уничтожения, написанная так же, как для struct MyObject
Object.
Пример с моей проблемой:
int main {
struct MyObject Object1;
ConstructMyObject(&Object1);
...
...
...
TransferOwnershipFunction(Object1.b); /*takes a struct string object as argument*/
...
...
...
DestructMyObject(&Object1);
return 0;
}
Вы видите, что я передал право собственности на одного члена Object1
другой функции, но все элементы Object1
будут уничтожены его деструктором в функции main
.
Как с ++ деструкторы справляются с такой ситуацией? Я не хочу, чтобы деструктор для struct string b
вызывался в конце main
, но он будет вызываться, потому что я вызываю деструктор для MyObject
. Функция TransferOwnershipFunction(...)
теперь отвечает за освобождение строкового объекта.
EDIT Кто-нибудь знает, как компилятор ржавчины решил бы эту проблему? Так что в Rust мне нужно клонировать объект struct string, который я передаю TransferOwnershipFunction
, или есть другой способ сделать это, потому что клонирует (или копирует я гусь), кажется, очень дорогая операция.