В C есть традиция использования структур нефиксированного размера, когда в конце структуры идет массив, и сколько элементов под него сверх размера базовой структуры зарезервируешь, столько и будет.
typedef struct
{
int size;
double p[];
} my_struct_t;
И дальше
my_struct_t* my_struct = (my_struct_t*) malloc(sizeof(my_struct_t) + sizeof(double) * my_size);
Полный код примера:
#include<stdio.h>
#include <stdlib.h>
typedef struct
{
int size;
double p[];
} my_struct_t;
int main(void)
{
int my_size = 5;
my_struct_t* my_struct = (my_struct_t*) malloc(sizeof(my_struct_t) + sizeof(double) * my_size);
my_struct->size = my_size;
for(int i=0; i<my_size; i++)
{
my_struct->p[i] = i;
printf("i = %i\n",i);
}
free(my_struct);
}
Вопрос, вот как бы такую структуру завернуть во что-то максимально С++’ное, чтобы с этим объектом можно было бы взаимодействовать как с объектом из мира C++, чтобы на него delete
срабатывал. Или очистка, когда указатель на него перестал существовать и т.п. Возможно чтобы можно было знать настоящий размер структуры для ее копирования.
А в ключевой момент, когда пришло время звать обработчик этой структуры написанный на Си, получить от этого объекта чистый my_struct_t*
и позвать нужную сишную функцию.
Есть auto_ptr
, емнип. Но он не решает вопрос с сохранением знания о размере структуры.
Есть ли что-то еще, более подходящее?