2017-07-05 3 views
0

Soweit ich weiß, gibt es kein Konzept für Zeiger in einer verwalteten Umgebung, in der Garbage Collector für die Speicherverwaltung zuständig ist. Wenn jemand die Pixelwerte in einer Bitmap manipulieren möchte, muss er zuerst wie im folgenden Code sperren.Warum ist Bitmap Scan0 nach dem Entsperren noch gültig?

Bitmap Image = new Bitmap(width, height, 
        System.Drawing.Imaging.PixelFormat.Format8bppIndexed); 
Rectangle rect = new Rectangle(0, 0, width, height); 
BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite, 
PixelFormat.Format8bppIndexed); 
IntPtr imageScan0 = bmpData.Scan0; 
unsafe 
{ 
    byte* ptr = (byte*)imageScan0; 
    for (int i = 0; i < height; i++) 
    { 
     for (int j = 0; j < width; j++) 
     { 
      *ptr++ = 128; 
     } 
      } 
     } 
Image.UnlockBits(bmpData); 

Mein Hauptproblem ist, dass: Wenn ich die imageScan0 Informationen speichern und dann die Bitmap entsperren, ich immer noch die imageScan0 können ihre Werte zu manipulieren, so wie ich es zwischen Schloss zu manipulieren und Operationen entsperren.

Ich habe es getestet und ich bin überrascht zu sehen, dass ImageScan0 noch gültig ist, um zu manipulieren. Meine Vermutung ist, dass die zugrunde liegende Bitmap im nicht verwalteten Speicher residiert.

+2

Natürlich ist es möglich, nach UnlockBits zu manipulieren, aber es ist nicht garantiert. Es kann oder darf nicht. –

Antwort

0

Mein Hauptproblem ist, dass: Wenn ich die imageScan0 Informationen speichern und dann die Bitmap entsperren, kann ich die imageScan0 auch verwenden, um ihre Werte zu manipulieren, genau wie ich zwischen Sperren und Entsperrungen manipulieren.

Sie können. Aber das heißt nicht, dass Sie können.

Das System ist nicht so ausgelegt, dass es den Speicher sofort 100% der Zeit ungültig macht, wenn Sie es entsperren. Die Sperre gab Ihnen einen Zeiger und versprach, dass dieser Zeiger für die Dauer bis zum Entsperren gültig bleibt.

Aber das Gegenteil ist nicht wahr. Das System garantiert nicht, dass der Zeiger nach dem Entsperren sofort ungültig wird.

Aber das bedeutet auch nicht, dass Sie damit umgehen können. Sie haben dem System gesagt, dass Sie mit dem Zeiger fertig sind. Es ist jetzt frei, es zu verschieben, zu entwerten, was immer es will. Du spielst mit Feuer, wenn du es weiterhin benutzt.

Es ist kein Problem per se, dass der Zeiger nach dem Entriegeln gültig bleibt. Es ist ein Problem für Sie, es zu verwenden; Es ist Ihre Job, um sicherzustellen, dass Sie nicht, nicht das System ist.

+0

@Lin: FYI: https://stackoverflow.com/help/someone-answers –

Verwandte Themen