Как в функции вызвать конструктор структуры обьявленной глобально?

struct testStruct
{
    BYTE* value = nullptr;
    int countValue = 0;
    int capacityValue = 0;
    testStruct()
    {
        value = (BYTE*)malloc(MAX_PATH);
        ZeroMemory(value, MAX_PATH);
        capacityValue = MAX_PATH;
    }
    ~testStruct()
    {
        free(value);
        countValue = 0;
        capacityValue = 0;
    }
};

testStruct g_values;

void func(BYTE* value, int valueSize)
{
    if(g_values.countValue > 0)
    {
        g_values.~testStruct();
    }
    int count = 0;
    for(;count < valueSize;count++)
    {
        g_values[count] = value[count];
    }
    g_values.value[count] = 0;
    g_values.countValue = count;
}

int main()
{
    BYTE FTemp[] = "FTEMP";
    int FTempSize = 5;
    BYTE STemp[] = "STEMP";
    int STempSize = 5;
    func(FTemp, FTempSize);
    printf("%s\n", g_values.value);
    func(STemp, STempSize);
    printf("%s\n", g_values.value);
}

Есть такой код. Мне нужно при повторном вызове функции func вызвать сначала деструктор что-бы небыло потери памяти а затем вызвать конструктор что-бы выделить новую память без значений которые были записаны в g_values.value при первом вызове func. Что-то на подобии такого условия.

if(g_values.countValue > 0)
{
    g_values.~testStruct();
    g_values.testStruct();
}

Я не понимаю как вызвать конструктор и можно-ли вообще его вызвать?

Я пробовал

if(g_values.countValue > 0)
{
    g_value.~testStruct();
    g_values = testValue();
}

но это не помогает. Вопрос могу-ли я вызвать как либо конструктор переменной g_values? Или-же мне нужно дописывать доп. функцию в структуру, которую будет вызывать конструктор что-бы заполнить память?


Ответы (1 шт):

Автор решения: Harry

Тут вот

g_values[count] = value[count];

у вас явная ошибка. Кроме того, Вам вообще не требуется деструктор-конструктор — зачем?! поскольку у вас все равно выделяется одна и та же память. Просто перепишите строку новыми значениями, и все... Вам вполне достаточно

void func(BYTE* value, int valueSize)
{
    int count = 0;
    for(;count < valueSize;count++)
    {
        g_values.value[count] = value[count];
    }
    g_values.value[count] = 0;
    g_values.countValue = count;
}

Но если очень хочется делать ненужную работу — делайте ее правильно:

struct testStruct
{
    BYTE* value = nullptr;
    int countValue = 0;
    int capacityValue = 0;
    testStruct()
    {
        value = (BYTE*)malloc(MAX_PATH);
        ZeroMemory(value, MAX_PATH);  // Тоже явно лишний вызов
        capacityValue = MAX_PATH;     // А смысл? У вас же другим это значение не бывает...
    }
    testStruct(const testStruct& t):testStruct()
    {
        countValue = t.countValue;
        memcpy(value,t.value,capacityValue);
    }
    ~testStruct()
    {
        free(value);
    }

    void swap(testStruct& t)
    {
        BYTE * t1 = value; value = t.value; t.value = t1;
        int t2 = countValue; countValue = t.countValue; t.countValue = t2;
        t2 = capacityValue; capacityValue = t.capacityValue; t.capacityValue = t2;
    }

    testStruct& operator = (const testStruct& t)
    {
        testStruct tmp(t);
        swap(tmp);
        return *this;
    }
};

testStruct g_values;

void func(BYTE* value, int valueSize)
{
    if(g_values.countValue > 0) g_values = testStruct(); // Зачем??!!!!
    int count = 0;
    for(;count < valueSize;count++)
    {
        g_values.value[count] = value[count];
    }
    g_values.value[count] = 0;
    g_values.countValue = count;
}

И запомните правило: если написали нетривиальный конструктор или там деструктор — пишите все: копирующий конструктор, деструктор, оператор присваивания...

→ Ссылка