Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

04.01.2008, 12:29

Naja der Fehler tritt nur dann auf und da sonst ja keine Daten in dem Vector sind die per deallocator gelöscht werden müssen ist es ja sogar sinnvoll ;)
Aber merkwürdig ist es dennoch und ich weiß nicht woran es liegt.

Ansonsten wurde allerdings nur Direct3D geladen und nja daran kann es nicht liegen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

12

04.01.2008, 13:05

Befindet sich get_supported_resolution zufällig in einer anderen DLL / App? Wenn ja, versuch mal mit Multithreaded DLL anstatt nur Multithreaded unter Code Generation zu arbeiten.

Wenn die CRT statisch gelinkt ist und Speicher in verschiedenen DLLs / Apps allokiert wird, d.h. in anderen Modulen freigegeben wird, also dort, wo er allokiert wurde, funktioniert das meistens nicht. Abhilfe schafft wie oben erwähnt entweder, die CRT dynamisch zu linken, oder du brauchst einen eigenen "globalen Heap" - also einen einzigen Heap, von dem alle DLLs ihren Speicher beziehen, realisierbar über STL Allocators. In zweitem Falle reicht es, Funktionsparameter und Rückgabewerte mit einem solchen Allocator zu bestücken - das heißt überall dort, wo Austausch unter den DLLs / DLL & App stattfindet - innerhalb lassen sich nach wie vor die STL Klassen mit ihrem Standardallocator verwenden.

13

04.01.2008, 13:26

Hmm ne das hab ich schon auf Multi-threaded Debug DLL (/MDd) im Debug-Build und Multi-threaded DLL (/MD) im Release-Build stehen ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

14

04.01.2008, 13:31

Es wäre dennoch interessant, folgendes zu tun: Vor dem Funktionsaufruf ein resolutions.reserve(MaximialeEnumAnzahl) - in der Funktion dann am Ende eine data.clear() und schauen, was passiert. Nächster Schritt wäre, das clear wegzulassen.

15

04.01.2008, 13:38

Selbes verhalten als wenn ich die Daten da reingetan hätte und im Destruktor aufräume hätte lassen (d.h. Absturz ;) ).
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

16

04.01.2008, 14:31

Hmm also nach http://caseys.kcfilms.com/2006/01/using_stl_objects_across_dll_b.php liegt es daran, doch eigtl. hab ich ja extra alles eingestellt ... hmm mal gucken.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

17

04.01.2008, 14:35

Naja, es bleibt festzuhalten, dass die Funktion, die Probleme macht, Deallocate ist. D.h. irgendein Stück Speicher kann nicht entfernt werden, obwohl es das eigentlich sollte (wenn wir von möglichen Bugs in der STL absehen) - da du selbst ja keinen Speicher allokierst.

Tritt der Fehler nun auch nach abschließendem data.clear() auf, sind alle Strings aufgeräumt. Das heißt, das Problem liegt offenslichtlich im Vector selbst. Oder tritt der Fehler beim abschließenden Clear auf? Wenn ja, wo? (In Clear? Vector / Strings? Wird Deallocate auch dort aufgerufen?)

Aufgrund von reserve sollte jetzt ja vorerst kein Speicher nachallokiert werden - und clear sollte auch die Vektorgröße, d.h. auch den Vektorspeicher, unangetastet lassen. Hast du MT DLL auch in allen Anwendungsteilen, also allen DLLs wie auch der Anwendung selbst eingestellt?

18

04.01.2008, 14:41

;) Also ich hab den Fehler jetzt. (http://support.microsoft.com/?scid=kb%3Ben-us%3B168958&x=5&y=17). Auch die Anwendung soll mit /MDd compiliert werden. Find ich merkwürdig, aber ok :D

Die Begründung findest du auf bei dem vorherigen Link:

Zitat

Therefore, when my object allocated in one DLL was returned passed by value to another DLL or EXE, the allocation and deallocations were occuring in different heap managers since it was across the DLL boundary. After the line of code was executed, the deconstructor for that newly passed value is called causing the access violation.
. Naja kann man nix machen, jetzt ist der Fehler endlich weg :D

Danke an alle die geholfen haben!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

19

04.01.2008, 14:46

Lol, ja, hab ich doch geschrieben. Das DLL bei der Option bezieht sich NICHT darauf, dass du eine Dll kompilierst, sondern dass du die DLL CRT verwendest, d.h. dass alle Teile (DLLs UND App) die CRT aus der selben dynamischen Library verwenden, somit den gleichen Heap, und somit keine Fehler verursachen.

Werbeanzeige