I am having trouble with a dll I am writing in C++. There is some very strange behavior going on that I have not been able to solve on my own.
It’s hard to describe exactly what’s going on, but I will try my best. Basically I have a class in my DLL with a single private property and a public constructor. When I initialize this class and then exit the program I get an error.
“Run-Time Check Failure #2 – Stack around the variable ‘test’ was
corrupted”
I have 2 projects here:
- The DLL named “testdll“.
- The console test program named “test“.
I have boiled this error down to its simplest reproducible form to try and narrow down the possible causes, below you will find my code.
Project “testdll”, file testdll.h:
#include <string>
class testdll
{
public:
__declspec(dllexport) testdll(); // Empty but same error if prams are used.
private:
std::string _var;
};
Project “testdll”, file testdll.cpp:
#include "testdll.h"
testdll::testdll()
{
}
Project “test”, file testdll.h:
#include <string>
class testdll
{
public:
__declspec(dllimport) testdll();
};
Project “test”, file stdafx.h:
#pragma once
#include "targetver.h"
#include <tchar.h>
Project “test”, file test.cpp:
#include "stdafx.h"
#include "testdll.h"
int _tmain(int argc, _TCHAR* argv[])
{
testdll test;
return 0;
}
If you want I can send you the Visual C++ 2010 solution file, in the archive format of your choice. Please help! I have no idea what’s going on.
Optional Information:
Language (or Software): C++
Already Tried:
Deleting the constructor definition, which works but is not a usable solution, nor does it explain the problem. Also making all of my private properties into pointers works, however I should not have to do this.
You are using two header files, they don’t declare the same class. One has a std::string member, the other doesn’t. That’s very very bad, the compiler doesn’t reserve enough space for the object on the stack frame. Which is what the runtime error is telling you. Very nice feature btw, this kind of mistake is incredibly hard to diagnose otherwise.
You probably got into this pickle because you only applied __declspec(dllexport) to the constructor instead of the entire class. You’ll need to write the header file so it can be used by both your dll project and your exe project. That should look like this:
Right-click your DLL project, Properties, C/C++, Preprocessor, Preprocessor Definitions. Append BUILDING_MYDLL
And delete the testdll.h file in your exe project directory. Set the C/C++, General, Additional Include Directories setting so the compiler can find the header in the testdll project directory (like ..\testdll)