deque push back конструктор по умолчанию не вызывается

Я реализовал класс, следуя правилу трех, и получаю сбой. После отладки я пришел к выводу, что в строке 51 конструктора копирования указатель oQueue не равен NULL из-за некоторой внутренней логики deque, и, следовательно, конструктор пытается удалить память и завершается неудачно.

Затем я где-то читал, что не должен проверять NULLness oQueue в конструкторе копирования, потому что он не может быть инициализирован в конструкторе. Не следует ли всегда инициализировать oQueue в NULL из-за конструктора по умолчанию?

    #include <iostream>
#include <deque>
#include <cstdlib>
#define LENGTH 128

typedef struct tDataStruct
{

char strA[LENGTH];

char strB[LENGTH];
int nNumberOfSignals;
double* oQueue;

tDataStruct()
{
nNumberOfSignals = 0;
oQueue = NULL;
memset(strA, 0, LENGTH);
memset(strB, 0, LENGTH);
}

~tDataStruct()
{
if (NULL != oQueue)
{
delete[] oQueue;
oQueue = NULL;
}
}

tDataStruct(const tDataStruct& other) // copy constructor
{
if (this != &other)
{
*this = other;
}

}
tDataStruct& operator=(const tDataStruct& other) // copy assignment
{
if (this == &other)
{
return *this;
}
strncpy_s(strA, other.strA, LENGTH);
strncpy_s(strB, other.strB, LENGTH);
nNumberOfSignals = other.nNumberOfSignals;
if (NULL != oQueue)
{
delete[] oQueue;
oQueue = NULL;
}
if (other.nNumberOfSignals > 0)
{
//memcpy(oQueue, other.oQueue, nNumberOfSignals);
}
return *this;
}
} tDataStruct;int main()
{
tDataStruct tData;

std::deque<tDataStruct> fifo;

fifo.push_back(tData);
}

-3

Решение

Ваша реализация конструктора копирования вызывает неопределенное поведение, так как переменные-члены конструируемого объекта не были инициализированы.

Вы можете использовать конструктор по умолчанию, чтобы сначала инициализировать переменные-члены, чтобы получить предсказуемое поведение.

tDataStruct(const tDataStruct& other) : tDataStruct()
{
*this = other;
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]