Wählen Sie das Produkt, für das Sie Hilfe benötigen:
STL-std::string-Klasse verursacht Abstürze und Speicherbeschädigung auf Multi-Prozessor-ComputernArtikel-ID: 813810 - Produkte anzeigen, auf die sich dieser Artikel bezieht Auf dieser SeiteProblembeschreibung Speicher kann bei dem Erstellen von Anwendungen von Microsoft Visual C++ 6.0, die das angegebene Standard Template Library (STL) verwenden, beschädigt werden oder der Computer reagiert möglicherweise nicht mehr der Ihre. Diese Symptome treten häufiger auf Multi-Prozessor-Computern auf. Derselbe Code funktioniert möglicherweise auf einem Einzel-Prozessor-Computer zuvor ohne solche Probleme. Wenn Sie das Fehler Threads in einem Debugger so untersuchen, finden Sie normalerweise unter dem Fehler in einer Speicherverwaltungsfunktion. Unter den Klassenmethoden basic string<char... > in dem Stack-Trace finden Sie häufig. Da Speicherbeschädigung auch ein Symptom ist, werden Fehler möglicherweise in Bereichen angezeigt, die unabhängig zu der Verarbeitung von Zeichenfolge sind.
Wo dieses Problem einen Absturz verursachte, ist beispielsweise folgender Stack-Trace: Ursache Das Standard Template Library (STL), das zu Microsoft Visual C++ 6.0 gehört, ist für Anwendungen von Multithreaded nicht sicher. Die Implementierungen der std::string Klasse hängen insbesondere von der Vorlageklasse basic string<...> ab. Der basic string<...> Vorlageklassenverweis zählt Kopien eines ausgeblendeten Zeichenpuffers. Die basic string<...> Vorlageklasse speichert die Anzahl in einem nicht signierten 8-Bitchar. Nach dieser Implementierung treten die folgenden allgemeinen Probleme auf:
Lösung Nachdem Sie threadsicher das STL durchführen, müssen Sie die Anwendung neu erstellen. Das Aktualisieren des STL auf einer neueren Version, die Standard auf dem aktuellen Visual C++ basiert, ist die ein threadsicheren STL erhaltende bevorzugte Methode. Das STL, das auf dem aktuellen Visual C++-Standard basiert, ist jedoch nicht identisch mit dem STL, das verfügbar zu dem Zeitpunkt der Veröffentlichung von Microsoft Visual 6.0 C++ als ein neues Produkt war. Das Aktualisieren auf einer neuen Version kann jedoch einfach je nach den STL-Funktionen, die Ihre Anwendung verwendet sein. Verwenden Sie eine der folgenden Methoden, um neue Versionen von dem threadsicheren STL zu erhalten:
Methode 1: Microsoft Visual Basic Anwendung Visual C++ (7.0 und höhere Versionen)Öffnen Sie jedes Visual C++-Projekt in Ihrer Anwendung, lassen zu, um das Projekt automatisch in dem neuen Projektformat zu konvertieren, und erstellen Sie dann es neu. Die std::string Klassenimplementierung in dieser Version ist threadsicher für das beschriebene Problem. Wenn Sie in beliebigem diesem der Projekte der Ihrem die DLL-Funktion der Laufzeitbibliothek in Ihrer Anwendung verwenden, müssen Sie die neuen Visual C++-Laufzeitkomponenten (wie Msvci7x.dll, Msvcp7x.dll und Msvcr7x.dll) mit Ihrer neu erstellten Anwendung verteilen.Hinweis: Sie müssen das Microsoft .NET Framework auf Clientcomputer nicht anordnen, um Microsoft Visual C++ zu verwenden. Methode 2: ANWENDUNG-MICROSOFT VISUAL BASIC-C++ 6.0 mit einem Ersatz STL von dritten PartyDie Details der Integration hängen nach Produkt ab und die einzelnen Kreditoren bieten Unterstützung. Eine Quelle für eine Nachfolger-STL-Version ist Dinkumware , Ltd. das Unternehmen das Microsoft das Visual C++ 6.0 STL lizenziert. Dass es in vorhandenen Erstellungsprozessen integriert werden kann, wird beansprucht. Besuchen Sie die folgende Dinkumware Web Website für Weitere Informationen und eine Übersicht über bekannt Probleme und bekannt Problemumgehungen:www.dinkumware.com Die Kontaktinformationen bezüglich der in diesem Artikel erwähnten Fremdanbieter sollen Ihnen helfen, den benötigten technischen Support zu finden Diese Kontaktinformationen können ohne vorherige Ankündigung geändert werden Dafür garantiert Microsoft nicht die Genauigkeit dieser Kontaktinformationen von Dritt-Anbieter. Die in diesem Artikel erwähnten Fremdanbieterprodukte werden von einem Lieferanten hergestellt, der von Microsoft unabhängig ist Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte
(http://www.dinkumware.com)
AbhilfeUmgehung des std::string-Klassenproblem in Microsoft Visual C++ 6.0 STLWenn Sie nicht auf einer neuen Version von dem STL aktualisieren, können Sie versuchen, das std::string Klasse-Threadsicherheit-Problem in der Microsoft Visual C++ 6.0-Standardinstallation zu beheben. Die sehr allgemeine und problematische Klasse ist by far std::string die Klasse, obwohl es multi-threading Probleme mit mehreren Klassen in dem Microsoft Visual C++ 6.0 STL geben. Die folgenden Schritte und die folgenden Problemumgehungen sind Stopgap-Measure, sicherzustellen, dass eine Anwendung richtig funktioniert, und die Measures Zeit für das Untersuchen weiterer Alternativen Zeit bieten. Berücksichtigen Sie, dass diese Anweisungen neue Codepfade und Verhalten vielleicht in Ihrer gesamten Anwendung erstellen werden. Gründlich testen die neu erstellte Anwendung entsprechend einem Unternehmen oder einer Person Sie Softwarerichtlinien vor umfangreicher Bereitstellung.Deaktivieren Sie einen Referenz-Zeichenfolge-ZählerDie einzelnen Problemumgehungen, die in diesem Abschnitt dokumentiert sind, erfordern, dass Sie den Reference-count-Mechanismus zuerst deaktivieren. Um einen Referenzzähler zu deaktivieren, müssen Sie die <xstring> Headerdatei ändern und Sie müssen die FROZEN Aufzählungskonstante auf 0 festlegen. Die Headerdatei <Xstring> ist Standard Installationen an dem folgenden Speicherort:C:\Program Files\Microsoft Visual Studio\VC98\Include Ändern Sie die FROZEN Aufzählungskonstante in 0 in der Headerdatei <xstring> in Zeile 62, damit es folgend ähnelt:
Methode 1: verwenden Sie nur statische CRT-BindungÄndern Sie die Einstellungen von Projekt in allen Projekten Ihren, die die die std::string Klasse verwenden, um auf der statischen Version der Microsoft-Laufzeitbibliothek (CRT) zu verknüpfen. Wenn Ihr Projekt außerdem verfügt über aktiviert von der Einstellung von Use MFC in a Shared DLL sein, können Sie diese Methode nicht verwenden. Gehen Sie für jedes Projekt folgendermaßen vor:
Methode 2: verwenden Sie dynamische CRT-BindungWenn zu der Laufzeitbibliothek (CRT) als ein DLL Ihr Projektcode verknüpft werden muss, müssen Sie eine andere Vorgehensweise annehmen. Standardeinstellung für DLL-Projekte lautet dynamischer CRT-Bindung. Abhängigkeiten von anderen Komponenten, wie MFC oder Bibliotheken von Dritt-Anbieter, die für Verwendung Ihrer Anwendung lizenziert sind, erfordern dynamische Bindung zu dem CRT normalerweise. Wenn MFC Ihre einzige Abhängigkeit ist können Sie die MFC in einer statischen Bibliothek verwenden Option verwenden und Sie können Methode 1 anwenden. Wenn Sie ein neues Projekt in Microsoft Visual C++ 6.0 erstellen, verwendet das Projekt das CRT aus einem DLL standardmäßig.Die CRT-Bindungsprojekteinstellung von dynamische verknüpft Ihre Anwendung an Implementierungen für std::string einige Klassenmethoden in dem bereits erstellten Microsoft CRT DLL, das als Msvcp60.dll bezeichnet wird. Für Funktionen, die aus der Bibliothek aufgerufen werden, wird die Änderung an der Konstante FROZEN, die Sie an die lokale Kopie von <xstring> vornahmen, nicht beachtet, da Microsoft das DLL erstellte, indem Microsoft die unveränderte <xstring> Headerdatei verwendet. Die fügt Funktionen wie Tidy() und Assign() ein, die zu der Verfügung in der Msvcp60.dll-Datei für die <char>- der basic string Klasse und die <short>-Instanziierung der basic string Klasse gestellt werden. Die basic string Klasse ist die Basis für die Klasse std::string. Gehen Sie folgendermaßen vor, um statische Implementierungen der std::string Klasse in Ihren Unterrichtseinheiten statt der Implementierungen von Microsoft-supplied in der Msvcp60.dll-Datei zu verwenden:
Methode 3: Verwenden eines intelligenten Hacks, um Bindungsprobleme zu vermeidenErstellen Sie ein Typedef für unsigned char und verwenden Sie das std::string statt des vorhandenen Klassentypedef. Das Typedef kann ein Formular, das enthalten wird, in einer Headerdatei in den Quelldateien der Anwendung, für die die std::string Klasse verwendet, dauern. Scheint das Typedef wie folgend vergleichbar:Methode: 4: Verwenden eines benutzerdefinierten std::string DLLDiese Option erhält Ihnen den Vorteil der kleinsten Codegröße, indem diese Option die Klassenimplementierungen std::string in einem einzelnen DLL versetzt. Erstellen Sie ein DLL-Projekt, das die std::string Klasse exportiert. Verknüpfen Sie mit dem DLL zu der Standard-Msvcp60.dll-Datei. Zusammmen mit Ihrer Anwendung müssen Sie dieses neue DLL weiterverteilen. Das ist eine erweiterte Option.Weitere Informationen Szenario, das auftreten kann, wenn ein Fehlen der Synchronisierung ist, wird in den folgenden C++-Codebeispielen veranschaulicht:
Thread1 startet, einen neuen Zeichenpuffer für die neue Zuordnung auf A1 zu erstellen, erkennt einen positiven Verweis-Zähler in seinem freigegebenen vorherigen Zeichenpuffer und dann in seinen Dekrementen, die von 1 zu 0 zählen. Im Verlauf von Zuordnung zu B B ist Thread2 auch der Freigaben Zeichenpuffer von A2 zu der gleichen Zeit und Thread2 löst den Verweis-Pufferzeichenzähler von A2 aus, zu versuchen es auf 2 zu erhöhen, bevor Thread1 ein 0 nur in dem Verweis-Zähler schreibt. Der Verweis-Zähler ist jetzt 0 statt 1. Der Verweis-Zähler hat 0 gewesen, wenn Zugriff auf den Verweis-Zähler synchronisiert wurde. Wenn Thread2 zu A2 einen neuen Wert zuweist sieht Thread2 den Verweis-Zähler 0 und Thread2 verwirft den freigegebenen ursprünglichen Zeichenpuffer, auf den B weiterhin verweist. Der Arbeitsspeicher, der den Zeichenpuffer enthielt, ist jetzt für andere Verwendungen in der Anwendung verfügbar. Std::string B bewegt jedoch einen Zeiger weiterhin an dem Zeichenpuffer. Die folgenden Szenarios verursachen Beschädigung und Abstürze:
Informationsquellen In das <I> das STL ist, das zu VC++-threadsicher gehört, findet Sie Weitere Informationen über Sprachen- und Compiler-Visual C++-Probleme? </I>-Thema Microsoft Most Valuable Professional (MVP) auf der folgenden Website:
http://www.mvps.org/vcfaq
(http://www.mvps.org/vcfaq)
EigenschaftenArtikel-ID: 813810 - Geändert am: Dienstag, 1. Juni 2004 - Version: 1.0
Maschinell übersetzter Artikel Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten. Den englischen Originalartikel können Sie über folgenden Link abrufen: 813810
(http://support.microsoft.com/kb/813810/en-us/
)
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
|





Zum Anfang







