双端队列推回默认构造函数未调用

时间:2018-10-11 05:58:33

标签: c++ stl stddeque

我遵循三个规则实现了一个类,但发生崩溃。调试后,我得出的结论是,在复制构造函数第51行中,由于双端队列的某些内部逻辑,指针oQueue不为NULL,因此构造函数尝试删除内存并失败。

然后我读到某个地方,我不应该检查副本构造函数中的oQueue是否为NULL,因为它可能没有在构造函数中初始化。由于默认构造函数,是否不应该将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 :(得分:2)

由于正在构造的对象的成员变量尚未初始化,因此复制构造函数的实现会调用未定义的行为。

您可以使用默认的构造函数首先初始化成员变量,以获取可预测的行为。

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