C++ 类构造函数可以内联或不内联。但是,我发现了一个奇怪的情况,只有内联类构造函数才能避免 Visual Studio 内存崩溃。示例如下:
dll.h
class _declspec(dllexport) Image
{
public:
Image();
virtual ~Image();
};
class _declspec(dllexport) Testimage:public Image
{
public:
Testimage();
virtual ~Testimage();
};
typedef std::auto_ptr<Testimage> TestimagePtr;
dll.cpp
#include "dll.h"
#include <assert.h>
Image::~Image()
{
std::cout<<"Image is being deleted."<<std::endl;
}
Image::Image()
{
}
Testimage::Testimage()
{
}
Testimage::~Testimage()
{
std::cout<<"Geoimage is being deleted."<<std::endl;
}
dll 库被编译为动态库,并静态链接到 C++ 运行时库 ( Multi-threaded Debug (/MTd)
)。运行该库的可执行程序如下:
int main()
{
TestimagePtr my_img(new Testimage());
return 0;
}
可执行程序将调用 dll 库,它还静态链接运行时库。我遇到的问题是在运行可执行程序时出现以下错误消息:
但是,当 dll 中的类构造函数被内联时,如下代码所示:
class _declspec(dllexport) Image
{
public:
Image();
virtual ~Image();
};
class _declspec(dllexport) Testimage:public Image
{
public:
Testimage()
{
}
virtual ~Testimage();
};
崩溃会消失。有人可以解释背后的原因吗?谢谢!顺便说一句,我使用的是VC2010。
编辑:以下情况也会触发相同的崩溃。
情况一
int main()
{
//TestimagePtr my_img(new Testimage());
Testimage *p_img;
p_img = new Testimage();
delete p_img;
return 0;
}