C++ 从DLL中删除指针

C++ 从DLL中删除指针,c++,pointers,dll,C++,Pointers,Dll,全部, 这是线程的延续 在卸载DLL后,在DLL内分配的指针似乎将变为坏指针。根据前面提到的线程中TBBle的建议,如果我立即删除同一函数中的指针,它会工作,但是如果我将指针返回到主应用程序,然后尝试从不同的函数访问它,指针会变坏 我相信,即使我把Foo类放在主应用程序中,也不会对我有任何好处,但我可能错了。这是因为DLL2将与DLL3一起卸载 那么,你知道如何让编译器开心,不引入任何内存泄漏,不崩溃吗 多谢各位 注:我只是按照评论末尾给出的建议来创建一个新问题。如果这样做不好,请道歉。指针所有

全部,

这是线程的延续

在卸载DLL后,在DLL内分配的指针似乎将变为坏指针。根据前面提到的线程中TBBle的建议,如果我立即删除同一函数中的指针,它会工作,但是如果我将指针返回到主应用程序,然后尝试从不同的函数访问它,指针会变坏

我相信,即使我把Foo类放在主应用程序中,也不会对我有任何好处,但我可能错了。这是因为DLL2将与DLL3一起卸载

那么,你知道如何让编译器开心,不引入任何内存泄漏,不崩溃吗

多谢各位


注:我只是按照评论末尾给出的建议来创建一个新问题。如果这样做不好,请道歉。

指针所有权必须具有一定的一致性。谁拥有指针?您不应该只分配内存,让它作为一个免费的指针生命周期管理者。如果它是不规则的,那么考虑一个<代码> STD::SysDypPTR 。@ PaulMcKunZi,指针管理是在主应用程序中完成的。所有者是主应用程序窗口。主应用程序窗口类有一个类Foo的成员,该类在函数返回后被分配指针地址。问题是指针是好的。但是当我关上主窗口时,它就坏了。没有人在空闲时间接触指针,也没有调用析构函数。Pimpl太弱,不允许您使用/MT构建DLL。销毁对象的是您的DLL,您不能允许客户端代码这样做,因为它使用自己的C运行时库副本。换句话说,您必须公开一个“destroy”函数,并且不允许客户端代码调用析构函数。接口是正确的方法,引用计数是这种内存管理的标准方法。与COM中的IUnknown接口相比,只有三个函数可以完成所有工作。@HansPassant,我正在使用/MDd重新编译所有内容。我将在这里张贴文字。关于“pimpl”-我过去经常摆脱“std::vector应该导出”警告。此外,DLL不应破坏对象-主应用程序将。所以我打算试试/MDd,希望它能解决这个问题。@PaulMcKenzie,std::shared_ptr是否只是C++11?指针所有权必须有一定的一致性。谁拥有指针?您不应该只分配内存,让它作为一个免费的指针生命周期管理者。如果它是不规则的,那么考虑一个<代码> STD::SysDypPTR 。@ PaulMcKunZi,指针管理是在主应用程序中完成的。所有者是主应用程序窗口。主应用程序窗口类有一个类Foo的成员,该类在函数返回后被分配指针地址。问题是指针是好的。但是当我关上主窗口时,它就坏了。没有人在空闲时间接触指针,也没有调用析构函数。Pimpl太弱,不允许您使用/MT构建DLL。销毁对象的是您的DLL,您不能允许客户端代码这样做,因为它使用自己的C运行时库副本。换句话说,您必须公开一个“destroy”函数,并且不允许客户端代码调用析构函数。接口是正确的方法,引用计数是这种内存管理的标准方法。与COM中的IUnknown接口相比,只有三个函数可以完成所有工作。@HansPassant,我正在使用/MDd重新编译所有内容。我将在这里张贴文字。关于“pimpl”-我过去经常摆脱“std::vector应该导出”警告。此外,DLL不应破坏对象-主应用程序将。所以我打算试试/MDd,希望它能解决它。@PaulMcKenzie,std::shared_ptr是否仅是C++11?