Heap corruption by vector argument
Hi there,
I've got a heap corruption when passing a std::vector<double> by value to
a method within a dll.
The problem occurs only in the release version of our project.
I'm using M$ Visual C++ .NET 2005.
The situation is as following:
B.dll:
class B {
public:
virtual init( std::vector<double> x ) = 0;
};
A.dll:
class A : public B {
/* virtual */ init( std::vector<double> x);
}
extern "C" A* CALLBACK createA( void );
The main program links B.dll at compiletime and A.dll at runtime.
....
aproc = GetProcAddress(A_Dll_Handle, "createA");
B* = (*aproc)();
....
Now I call virtual method init on the base pointer B which is in fact an A
object.
std::vector<double> mainVec(30);
B->init(mainVec);
A copy of mainVec is placed on the stack. The copy allocates memory for
the copied doubles!
When leaving B::init() the copy of mainVec is destructed. The calling
convention of B.dll is __cdecl.
Now it seems to me that deallocation of the memory of mainVecs copy is
done with an unmatching deallocation scheme or the wrong heap structure.
When it comes to deallocation I got a crash stating that the heap is
probably corrupted.
Does anyone has an idea how to fix this problem?
Since the B library comes from another project partner, the interface
might not be changed to a call by reference, which would probably solve
the issue.
I tried to change the calling convention to __stdcall which would probably
destruct the copy in the main program (!?) but I got lots of undefined
references in the standard libraries then.
I also read many articles about heap corruption which state, that memory
should be deallocated in the same module there it was allocated.
I was wondering if the main program and the dll's have their own code for
allocators? (Multiple defined symbols that do not interfere because
they're not exported from the dll?) I strongly guess, that linkage is the
cause of this problem, but how can I solve it?
I appreciate any help
Best regards
Maik
--
Erstellt mit Operas revolution?rem E-Mail-Modul: http://www.opera.com/mail/