none
MSVC和MinGW在处理多内存空间中的单例对象的差异 RRS feed

  • 问题

  • 创建两个工程一个是名为SingleTest的可执行程序,一个是名为SingleTestLib的DLL。

    在SingleTestLib中实现一个单例并导出

    class SINGLETESTLIBSHARED_EXPORT TSingleton
    {
    public:
        static TSingleton *GetInstance()
        {
            static TSingleton *m_pInstance = NULL;
            if(m_pInstance == NULL)
            {
                qDebug()<<"Structure TSingleton!";
                m_pInstance = new TSingleton;
            }
            return m_pInstance;
        }
        void RelaseInstance()
        {
            delete this;
        }
    private:
        TSingleton()
        {
        }
    };

    再在SingleTestLib中实现一个类:class SingleTestLib并在其中实例化TSingleton

    SingleTestLib::SingleTestLib()
    {

        TSingleton::GetInstance();

    }

    同时在工程SingleTest中引用SingleTestLib.dll 在其中实例化单例TSingleton,同时实例化class SingleTestLib。

    int main()

    {

        TSingleton::GetInstance();

        new SingleTestLib();

    }

    从运行结果来看。

    MinGW会创建两个TSingleton的实例。而MSVC只会创建一个。

    个人理解,通过可执行程序去执行动态库里的代码。可执行程序和动态库会有自己的内存空间,也就有各自的静态存储区。在实例化单例的时候,自然会各自实现一个实例。所以不是很理解MSVC的实现方式。

    2018年4月8日 13:00

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    该论坛是讨论c++开发过程中遇到的代码问题,对于你的问题,更多是关于MSVC的内部实现,建议你到下面的论坛去询问。

    https://developercommunity.visualstudio.com/

    谢谢你的理解与支持。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年4月9日 8:09