AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Ungültige Zeigeroperation (FreeMem)
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültige Zeigeroperation (FreeMem)

Ein Thema von Alter Mann · begonnen am 1. Okt 2016 · letzter Beitrag vom 2. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 11:25
Moin,

nachdem ich nun Besitzer von 10.1 Update 1 Prof bin, wollte ich 'alten' Code weiterverwenden,
doch nun bekomme ich aufeinmal die Fehlermeldung: 'Ungülltige Zeigeroperation' an dieser Stelle:
Code:
...
var
  Buffer : Pointer;
  Msg   : String;
  dwSize : DWORD;
  dwBW  : DWORD;
...
  dwSize := Length(Msg) * SizeOf(Char) + 1;
  dwBW  := 0;
  GetMem(Buffer, dwSize);
  Move(Msg, Buffer, dwSize);
  Result := WriteFile(FHandle, Buffer, dwSize, dwBW, nil);
  FreeMem(Buffer, dwSize);                                              [COLOR="Lime"]<- Hier[/COLOR]
...
Schon etwas Komisch, da es bei der Starter Edition 10.1 und früheren Versionen keine Fehlermeldung gab.

Hat jemand einen Tipp?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 12:27
Ich wundere mich, daß das überhaupt je funktioniert haben soll.

Move(Msg, Buffer, dwSize);
kopiert den Pointer auf einen Text (= eine String-Variable) in einen untypisierten Pointer, aber nicht den Textinhalt in den Speicherbereich, auf den der Pointer zeigt. Das spätere FreeMem gibt dann also Speicher frei, der eigentlich der string-Variablen gehört.

Müsste es nicht eher so heißen:

Move(Msg[1], Buffer^, dwSize);

Ähnlich auch bei WriteFile

WriteFile(FHandle, Buffer^, dwSize, dwBW, nil);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.588 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 13:24
// EDIT: hatte den Tab wohl zu lange offen, ich lasse es mal trotzdem so

Ich frage mich wie das jemals funktioniert hat. Vielleicht gab es vorher ein anderes Move als System.Move?

Move bekommt einen Puffer als ersten Parameter, d.h. du müsstest das erste Zeichen übergeben, nicht den String (was intern ja ein Pointer ist). Und warum das +1 bei der Größe? So schreibst du die eine Hälfte des Nullzeichens mit in die Datei!?

Dazu kommt, dass WriteFile genau wie Move im zweiten Parameter einen Puffer übergeben bekommt und keinen Pointer auf die Daten.
Eventuell hat sich diese Deklaration in Delphi irgendwann geändert.

So wäre es korrekt:
Delphi-Quellcode:
var
  Buffer : Pointer;
  Msg : String;
  dwSize : DWORD;
  dwBW : DWORD;
...
  dwSize := Length(Msg) * SizeOf(Char);
  dwBW := 0;
  GetMem(Buffer, dwSize);
  Move(Msg[1], Buffer^, dwSize);
  Result := WriteFile(FHandle, Buffer^, dwSize, dwBW, nil);
  FileClose(FHandle);
  FreeMem(Buffer, dwSize);
Allerdings frage ich mich warum du das so kompliziert machst. Warum nicht einfach so?
Delphi-Quellcode:
var
  Msg : String;
  dwSize : DWORD;
  dwBW : DWORD;
...
  dwSize := Length(Msg) * SizeOf(Char);
  dwBW := 0;
  Result := WriteFile(FHandle, Msg[1], dwSize, dwBW, nil);
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 13:43
Hi,

Code:
procedure Move(const Source; var Dest; Count: NativeInt);
Das +1 kommt daher, dass ja noch Platz für das abschließende #00 sein soll.

Hat aber nichts mit FreeMem zu tun.
Der Code läuft garantiert unter D5, D7, D2009, XE8 und 10.1 Starter, nur nicht unter 10.1 Up1.
Und das ist das Problem.

[EDIT]
Ich maches es jetzt so:
Code:
Result := WriteFile(FHandle, Pointer(Msg)^, dwSize, dwBW, nil);
[/EDIT]

DANKE

Geändert von Alter Mann ( 1. Okt 2016 um 13:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 13:52
Hat aber nichts mit FreeMem zu tun.
Natürlich hat es das! Wenn du den Pointer unter Buffer überschreibst, dann kann das FreeMem damit nicht mehr wirklich was anfangen.


Der Code läuft garantiert unter D5, D7, D2009, XE8 und 10.1 Starter, nur nicht unter 10.1 Up1.
Und das ist das Problem.
Das ist wohl eher Zufall!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.588 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 14:08
Das +1 kommt daher, dass ja noch Platz für das abschließende #00 sein soll.
Erstens sind ein Nullzeichen SizeOf(Char) = 2 Byte, nicht nur 1 Byte, und zweitens ist das innerhalb einer Datei absolut unüblich ein Nullzeichen drin zu haben.

Der Code läuft garantiert unter D5, D7, D2009, XE8 und 10.1 Starter, nur nicht unter 10.1 Up1.
Bei mir nicht und ich hätte mich auch gewundert. Denn die Parameter für Move und WriteFile sehen da schon genauso aus.

pointerxpd5.jpg
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 14:15
Ist zwar schon ne weile her seit ich Delphi programmiert hab aber das:

Code:
Result := WriteFile(FHandle, Pointer(Msg)^, dwSize, dwBW, nil);
wird so auch nicht wirklich funktionieren, wenn ich das noch richtig im Kopf hab.

Damit interpretierst du nur die ersten 32 Bit des Strings als Adresse, aber der der Inhalt stehen soll.

Die Variante von jaenicke wär die einfachste, die auch wirklich funktioniert.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.588 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 1. Okt 2016, 21:59
Doch, Pointer(Msg)^ geht. Das liegt daran, dass ein String intern ein Pointer auf die Stelle im Speicher zwischen Referenzzähler, Stringlänge und dem Stringinhalt selber ist. Ein Cast auf Pointer ergibt daher den Pointer auf das erste Zeichen und durch dessen Dereferenzierung landet man beim ersten Zeichen. Das als Puffer übergeben funktioniert dann.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 2. Okt 2016, 03:07
Moin, Moin,

ich glaub, ich werde alt

Ihr habt nartürlich Recht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#10

AW: Ungültige Zeigeroperation (FreeMem)

  Alt 2. Okt 2016, 08:57
Na das Problem lasst sich leicht lösen.

Benenn dich doch einfach um.







Junger Mann
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz