应用程序在隐式声明的运算符=

问题描述 投票:0回答:1

我创建了以下类“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;
    }
}

部分摘录的故障转储如下。

  • mfc140u!CWnd::OnWndMsg+0xe75
  • mfc140u!CWnd::WindowProc+0x3f
  • mfc140u!AfxCallWndProc+0x11e
  • mfc140u!AfxWndProc+0x54
  • mfc140u!AfxWndProcBase+0x49
  • user32!UserCallWinProcCheckWow+0x2d1
  • user32!DispatchMessageWorker+0x1f1
  • mfc140u!AfxInternalPumpMessage+0x52
  • mfc140u!CWinThread::运行+0x81
  • mfc140u!AfxWinMain+0xc0
  • MyApp!TestImageEncoder::operator=+0x5af62 <- Why was it called even though I did not write the code to call it?
  • kernel32!BaseThreadInitThunk+0x1d
  • ntdll!RtlUserThreadStart+0x28
c++ windows visual-c++ mfc
1个回答
0
投票

当编译器包含 TestImageEncoder 的默认赋值运算符 (operator=) 时,就会出现问题,导致 mpFactory 无意中出现浅重复。即使没有显式使用 =,当您按值返回或提供对象时,这种情况仍然可能发生。

要解决该问题并防止意外重复,请删除赋值运算符和复制构造函数:

TestImageEncoder(const TestImageEncoder&) = delete;
TestImageEncoder& operator=(const TestImageEncoder&) = delete;

这可以防止任何可能导致崩溃的无意复制。如果需要复制,请编写定制代码以正确处理 mpFactory。

© www.soinside.com 2019 - 2024. All rights reserved.