deque push back конструктор по умолчанию не вызывается - PullRequest
0 голосов
/ 11 октября 2018

Я реализовал класс, следуя правилу трех, и получаю сбой.После отладки я пришел к выводу, что в строке 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);
    }

1 Ответ

0 голосов
/ 11 октября 2018

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

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

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