我创建了以下类“TestImageEncoder”并对其进行了实例化,并在方法“TestProcess”中调用了“EncodeData()”16 次,该方法也被调用了大约 20 次。
MyApp 突然崩溃了,当我看到崩溃转储时,我发现 TestImageEncoder::operator= 就是崩溃点。
我知道应该隐式声明运算符=,但我不使用“=”作为 TestImageEncoder,正如您在 TestProcess() 中看到的那样。
为什么调用隐式运算符=?哪里?
你能解释一下我的代码发生了什么吗?
class TestImageEncoder
{
private:
IFactory* mpFactory;
public:
TestImageEncoder();
virtual ~TestImageEncoder();
BOOL EncodeData( WORD* pSrcData, int srcSize, BYTE** pDstData, int& dstSize );
};
void TestProcess(WORD* srcData, int srcSize)
{
Byte* pDst = NULL;
int dstSize = 0;
TestImageEncoder encoder;
for ( int i = 0; i < 16; i++ )
{
encoder.EncodeData( srcData, srcSize, &pDst, dstSize );
// Do something with the encoded data ////////////////////
// .....
delete[] pDst;
pDst = NULL;
}
}
部分摘录的故障转储如下。
当编译器包含 TestImageEncoder 的默认赋值运算符 (operator=) 时,就会出现问题,导致 mpFactory 无意中出现浅重复。即使没有显式使用 =,当您按值返回或提供对象时,这种情况仍然可能发生。
要解决该问题并防止意外重复,请删除赋值运算符和复制构造函数:
TestImageEncoder(const TestImageEncoder&) = delete;
TestImageEncoder& operator=(const TestImageEncoder&) = delete;
这可以防止任何可能导致崩溃的无意复制。如果需要复制,请编写定制代码以正确处理 mpFactory。