निम्नलिखित उदाहरण कोड में AssertTestObj()
पर कॉल का उपयोग उल्लंघन उल्लंघन का कारण बनता है।कैसे जांचें कि प्रक्रिया का संदर्भ शून्य है या नहीं?
परियोजना InvokeTest2.exe '0x00000000 पर पहुँच उल्लंघन: पता 0x00000000 का पढ़ा' संदेश साथ अपवाद वर्ग $ C0000005 उठाया।
जब डिबगिंग मैं देख सकता हूँ कि TSafeCall<T>.Invoke()
में Assigned(NotifyProc)
परीक्षण अपेक्षा के अनुरूप काम नहीं करता है - ताकि Invoke()
NotifyProc
जो nil
है पर अमल करने की कोशिश करता है और इस तरह पहुँच उल्लंघन का कारण बनता है।
कोई भी विचार क्यों विफल रहता है और इसे कैसे हल किया जाए?
program InvokeTest2;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TSafeCall<T> = class
public
type
TNotifyProc = reference to procedure (Item: T);
class procedure Invoke(NotifyProc: TNotifyProc; Item: T); overload;
end;
TOnObj = procedure (Value: String) of object;
{ TSafeCall<T> }
class procedure TSafeCall<T>.Invoke(NotifyProc: TNotifyProc; Item: T);
begin
if Assigned(NotifyProc) then
NotifyProc(Item);
end;
procedure AssertTestObj(OnExceptionObj_: TOnObj; Value_: String);
begin
TSafeCall<String>.Invoke(OnExceptionObj_, Value_);
end;
begin
try
TSafeCall<String>.Invoke(nil, 'works as expected');
AssertTestObj(nil, 'this causes an access violation!');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
[आरएसपी -10204] (https://quality.embarcadero.com/browse/RSP-10204) –
@ मार्टिन के रूप में रिपोर्ट किया गया है आप संस्करण संख्या 21.0.17707.5020 के साथ संस्करण को XE7 अपडेट 1 के रूप में उपयोगी रूप से बदल सकते हैं। यह नवीनतम है, और जहां मैंने अपना परीक्षण किया। –