2017-03-27 73 views
-1

創建T流它無法在這個簡單的例子:不能在拉撒路

 procedure TForm1.Button1Click(Sender: TObject); 
     var 
     ts: TStream; 
     begin 
     ts.Create; //<---- fails here 
     ts.Free; 
     end; 

出現錯誤:

Project project1 raised exception class 'External: SIGSEGV'. 
At address 10000DB38 

回答

5

您使用了錯誤的代碼。它應該是

procedure TForm1.Button1Click(Sender: TObject); 
     var 
     ts: TStream; 
     begin 
     ts := TStream.Create; // If Lazarus supports creation of Stream instances. 
     ts.Free; 
     end; 

直到創建它,你的變量ts只包含從以前使用棧垃圾。您必須調用該類的構造函數來分配堆上的實際對象,並指向您的變量ts

如果拉撒路抱怨說,它不能創建T流的一個實例(它可以把它當作一個抽象類,我沒有拉撒路這臺機器檢查),嘗試這樣的事情,而不是:

var 
    ts: TMemoryStream; 
    begin 
    ts := TMemoryStream.Create; 
    ts.Free; 
    end; 

而不是TMemoryStream,你可以使用任何其他具體的TStream後裔類。

+0

這是一個重複幾百次了,不是嗎? –

+1

@DavidHeffernan:我認爲問題在於,如果提問者知道要問什麼,他們不需要問,因爲他們不會首先遇到問題。相反,令我驚訝的是,越來越無誤的谷歌並沒有返回搜索結果的第一頁上搜索「delphi創建訪問違規」的原因。現在,ime似乎找到了前2-3的正確答案。 – MartynA

+0

不知道你的谷歌在做什麼,但是在這裏,這些搜索條件產生了我提出的第一個命中的騙局 –

0

當時的淵源嘗試這種代碼:

memStream.Create; 

但它應該是:

memStream := TMemoryStream.Create; 

等等...