Как в функции вызвать конструктор структуры обьявленной глобально?
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 шт):
Тут вот
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;
}
И запомните правило: если написали нетривиальный конструктор или там деструктор — пишите все: копирующий конструктор, деструктор, оператор присваивания...