复制构造函数中的递归调用
recursive call in copy constructor
我按照三的规则实施了 class,但遇到了崩溃。经过调试,我得出的结论是复制构造函数重复调用自身而不是调用相等运算符。为什么会这样?它不应该调用相等运算符吗?
#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=(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);
}
在你的复制构造函数中你使用
*this = other; //(1)
调用
tDataStruct& operator=(tDataStruct other) //(2)
因为 other
是按值传递的,所以需要进行复制。然后调用 1
,调用 2
,然后调用 1
,然后调用 2
,一轮又一轮,直到程序 crashes/terminates .
你需要参考 other
这样你就不会像
tDataStruct& operator=(const tDataStruct& other)
所有这些都说你在倒退。您应该使用 copy and swap idiom 并使用您的复制构造函数实现您的 operator =
。
您的复制构造函数调用赋值:
tDataStruct(const tDataStruct& other) // copy constructor
{
// NOTE: this redundant check is always true.
// Please remove the if.
if (this != &other)
{
*this = other;
}
}
然后,由于赋值运算符通过值(而不是通过引用)获取对象,因此调用复制构造函数以复制参数:
tDataStruct& operator=(tDataStruct other) // copy assignment
{
这就是你得到相互递归的方式。
尝试通过引用传递:
tDataStruct& operator=(const tDataStruct &other) // copy assignment
我按照三的规则实施了 class,但遇到了崩溃。经过调试,我得出的结论是复制构造函数重复调用自身而不是调用相等运算符。为什么会这样?它不应该调用相等运算符吗?
#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=(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);
}
在你的复制构造函数中你使用
*this = other; //(1)
调用
tDataStruct& operator=(tDataStruct other) //(2)
因为 other
是按值传递的,所以需要进行复制。然后调用 1
,调用 2
,然后调用 1
,然后调用 2
,一轮又一轮,直到程序 crashes/terminates .
你需要参考 other
这样你就不会像
tDataStruct& operator=(const tDataStruct& other)
所有这些都说你在倒退。您应该使用 copy and swap idiom 并使用您的复制构造函数实现您的 operator =
。
您的复制构造函数调用赋值:
tDataStruct(const tDataStruct& other) // copy constructor
{
// NOTE: this redundant check is always true.
// Please remove the if.
if (this != &other)
{
*this = other;
}
}
然后,由于赋值运算符通过值(而不是通过引用)获取对象,因此调用复制构造函数以复制参数:
tDataStruct& operator=(tDataStruct other) // copy assignment
{
这就是你得到相互递归的方式。
尝试通过引用传递:
tDataStruct& operator=(const tDataStruct &other) // copy assignment