双端队列推回未调用的默认构造函数
deque push back default constructor not called
我按照三的规则实施了 class,但遇到了崩溃。调试后我得出结论,在复制构造函数行号 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);
}
您的复制构造函数的实现调用了未定义的行为,因为正在构造的对象的成员变量尚未初始化。
您可以使用默认构造函数首先初始化成员变量以获得可预测的行为。
tDataStruct(const tDataStruct& other) : tDataStruct()
{
*this = other;
}
我按照三的规则实施了 class,但遇到了崩溃。调试后我得出结论,在复制构造函数行号 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);
}
您的复制构造函数的实现调用了未定义的行为,因为正在构造的对象的成员变量尚未初始化。
您可以使用默认构造函数首先初始化成员变量以获得可预测的行为。
tDataStruct(const tDataStruct& other) : tDataStruct()
{
*this = other;
}