You may experience an access violation when you access an STL object through a pointer or reference in a different DLL or EXE
2017-08-07 19:42
597 查看
Symptoms
When accessing an STL object created in one DLL or EXE through a pointer or reference in a different DLL or EXE, you may experience an access violation or other serious program errors including the appearance of data corruption or data loss.Cause
Most classes in the Standard C++ Libraries use static data members directly or indirectly. Since these classes are generated through template instantiation, each executable image (usually with DLL or EXE file name extensions) will contain its own copy of the static data member for a given class. When a method of the class that requires the static data member is executed, it uses the static data member in the executable image in which the method code resides. Since the static data members in the executable images are not in sync, this action could result in an access violation or data may appear to be lost or corrupted.Resolution
Export accessor methods from the executable image that created the STL object. These methods wrap the required functionality of the STL object. In this way, the STL object will only be directly accessed inside a single executable image. For example, suppose MyProgram.EXE needs to get the next element in deque<MyClass> that resides in MyLibrary.DLL. MyLibrary.DLL could export an accessor method, MyClass* DequeNextItem (/*...*/). Then MyProgram.EXE could execute this method to get the next item in the deque. See the code sample below for a more complete example.This option works for STL objects that are either global, static, or static data members of a class that are not exported from a DLL. This option will not work for non-static data members of a class that are exported from a DLL or for automatic data.
Export the template class instantiation from one executable image and import it into the other executable images. For example, if MyLibrary.DLL passes a pointer to vector<MyClass> back to a function in MyProgram.EXE, then export the classes MyClass and vector<MyClass> from MyLibrary.DLL. Then import these classes into MyProgram.EXE. By doing this, you will have one copy of the static class members residing in MyLibrary.DLL. For more information about exporting and importing STL, click the following article number to view the article in the Microsoft Knowledge Base:
168958 How to export STL components inside and outside of a class
Status
This behavior is by design.More Information
Steps to reproduce the behavior
//--------------------------------------------------------- // AVEXE.CPP // Compile options needed: /GX #pragma warning (disable : 4786) #include <map> #include <string> #include <stdio.h> __declspec(dllimport) std::map<int,std::string>* GiveMeAMap(int n); __declspec(dllimport) void ShowMeTheMap(std::map<int,std::string> *amap); __declspec(dllexport) const char* MapItemX (std::map<int,std::string> *m, int x); int main () { // Create the map in the DLL int x = 6; std::map<int,std::string> *p = GiveMeAMap(x); // Display the contents of the map from the DLL printf("Showing contents from the DLL\n"); ShowMeTheMap(p); // Display the contents of the map from the EXE // using the accessor function from the DLL so we // aren't directly accessing the map printf("Showing contents from the EXE using accessor\n"); int i = x; while (i--) { printf("%d = %s\n",i,MapItemX(p,i)); } // Access Violation when accessing the map that // was created in the DLL from the EXE printf("Showing contents from the EXE directly\n"); while (x--) { printf("%d = %s\n",x,(*p)[x].c_str()); } return 0; } //--------------------------------------------------------- // AVDLL.CPP // Compile options needed /GX #pragma warning (disable : 4786) #include <map> #include <string> #include <stdlib.h> // Create the map here in the DLL __declspec(dllexport) std::map<int,std::string>* GiveMeAMap(int n) { std::map<int,std::string> *m = new std::map<int,std::string>; while(n--) { char b[33]; itoa(n,b,2); (*m) = std::string(b); } return m; } // We can access the map without error from the executable // image where the map was created __declspec(dllexport) void ShowMeTheMap(std::map<int,std::string> *p) { int x = p->size(); while (x--) { printf("%d = %s\n",x,(*p)[x].c_str()); } } // An accessor method to return the associated C string // for key x __declspec(dllexport) const char* MapItemX (std::map<int,std::string> *m, int x) { return (*m)[x].c_str(); }
Properties
Article ID: 172396 - Last Review: Sep 2, 2005 - Revision: 1
相关文章推荐
- You may receive an "Access Denied" or a "Permission Denied" scripting error message when you browse a secure Web site that contains multiple frames
- MS Known Issue: About Passing STL object pointer/reference in different modules
- Error message when you try to modify or to delete an alternate access mapping in Windows SharePoint Services 3.0: "An update conflict has occurred, and you must re-try this action"
- You receive a "Setup Library wbemupgd.dll could not be loaded" error message when you use Add or Remove Programs in Windows Server 2003
- Unhandled exception at 0x00000000 in CallDll.exe: 0xC0000005: Access violation reading location 0x00
- PPStream caused an Access Violation (0xc0000005) in module VSFilter.dll at 001b:07610441.
- In C how do you redirect stdin/stdout/stderr to files when making an execvp() or similar call?
- First-chance exception at 0x774CEB23 (ntdll.dll) in XXX.exe: 0xC0000005: Access violation writing
- BOOTSTRAP caused an access violation in IMSCUI.DLL at 0x3c45039c
- [转] When exactly does the virtual table pointer (in C++) gets set for an object?
- Error: Exception was raised when calling event-notify Vuser function in extension parameng.dll: System Exceptions: EXCEPTION_ACCESS_VIOLATION
- Compiler Error Message: CS0234: The type or namespace name 'BorderDetails' does not exist in the class or namespace 'Infragistics.WebUI.Shared' (are you missing an assembly reference?)
- error: warning: Stopped in a context claiming to capture an Objective-C object pointer,
- HOW TO: Find the Problem Exception Stack When You Receive an UnhandledExceptionFilter Call in the St
- the diff of implement when ram interface is direct address mapping or is access through register
- [Solved] DashBoard – Excel Service: The data sources may be unreachable, may not be responding, or may have denied you access.
- SQLSTATE[42000]: Syntax error or access violation: 1055 'kf_local.g.group_name' isn't in GROUP BY
- Ionic/Angular TypeScript 错误:Object prototype may only be an Object or null: undefined的解决办法
- [eZ publish] When a ezxml embed an video, how to get the ezxml object in the video embed template?
- "Access denied" when opening files or folders created in Windows 7 from Windows XP