我在用C ++编写的dll遇到问题。发生了一些非常奇怪的行为,我无法自行解决。
很难确切描述正在发生的事情,但是我会尽力而为。基本上,我的DLL中有一个带有单个私有属性和一个公共构造函数的类。当我初始化此类并退出程序时,出现错误。
“运行时检查失败#2-变量'test'周围的堆栈为
损坏”
我在这里有2个项目:
DLL名为“ testdll”。
控制台测试程序名为“ test”。
我将这个错误简化为最简单的可重现形式,以尝试缩小可能的原因,下面您将找到我的代码。
项目“ testdll”,文件testdll.h:
#include <string>
class testdll
{
public:
__declspec(dllexport) testdll(); // Empty but same error if prams are used.
private:
std::string _var;
};
项目“ testdll”,文件testdll.cpp:
#include "testdll.h"
testdll::testdll()
{
}
项目“ test”,文件testdll.h:
#include <string>
class testdll
{
public:
__declspec(dllimport) testdll();
};
项目“ test”,文件stdafx.h:
#pragma once
#include "targetver.h"
#include <tchar.h>
项目“ test”,文件为test.cpp:
#include "stdafx.h"
#include "testdll.h"
int _tmain(int argc, _TCHAR* argv[])
{
testdll test;
return 0;
}
如果您希望我可以选择的存档格式向您发送Visual C ++ 2010解决方案文件。请帮忙!我不知道是怎么回事。
可选信息:
语言(或软件):C ++
已尝试:
删除有效的构造函数定义,但不是可用的解决方案,也不能解释问题。也可以将我所有的私有属性都做成指针,但是我不必这样做。
最佳答案
您正在使用两个头文件,它们没有声明相同的类。一个具有std :: string成员,另一个则没有。这非常非常糟糕,编译器没有为堆栈框架上的对象保留足够的空间。这是运行时错误告诉您的内容。顺便说一句,非常好用,否则很难诊断这种错误。
您可能会陷入困境,因为您仅将__declspec(dllexport)应用于构造函数,而不是整个类。您需要编写头文件,以便您的dll项目和exe项目都可以使用它。看起来应该像这样:
#undef DLLEXPORT
#ifdef BUILDING_MYDLL
# define DLLEXPORT __declspec(dllexport)
#else
# define DLLEXPORT __declspec(dllimport)
#endif
class DLLEXPORT testdll
{
public:
testdll();
private:
std::string _var;
};
右键单击您的DLL项目,属性,C / C ++,预处理器,预处理器定义。追加BUILDING_MYDLL
并删除您的exe项目目录中的testdll.h文件。设置“ C / C ++,常规,附加包含目录”设置,以便编译器可以在testdll项目目录(例如.. \ testdll)中找到标头