{"id":2058,"date":"2020-05-08T15:17:55","date_gmt":"2020-05-08T14:17:55","guid":{"rendered":"https:\/\/gdksoftware.com\/knowledgebase\/smartpointers-in-delphi"},"modified":"2026-01-13T14:12:21","modified_gmt":"2026-01-13T13:12:21","slug":"smartpointers-in-delphi","status":"publish","type":"knowledge","link":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi","title":{"rendered":"Smartpointers in Delphi"},"content":{"rendered":"<p>Zoals je misschien weet heeft Delphi geen garbare collection. ARC zal snel <a href=\"https:\/\/blog.marcocantu.com\/blog\/2018-october-Delphi-ARC-directions.html\" target=\"_blank\" rel=\"noopener noreferrer\">verwijderd<\/a> worden van de niet-Windows compiler. Delphi heeft dus geen structuur voor het automatisch opruimen van objecten. We hebben onderzoek gedaan om te zien of Smartpointers geschikt zijn voor het automatisch opruimen van objecten. Het concept van Smartpointers is ontleend aan C++ en is in Delphi voor het eerst ge\u00efntroduceerd door Barry Kelly. Het Spring4D framework heeft ook een implementatie van Smartpointers.<\/p>\n<p>Om een voorbeeld te geven van het gebruik van Smartpointers bekijken we een aantal codes:<\/p>\n<pre>var\r\n  s: TStringList;\r\nbegin\r\n  s := TStringList.Create;\r\ntry\r\n  DoSomething(s);\r\nfinally\r\n  s.Free;\r\nend;<\/pre>\n<p>Met Smartpointers ziet de code er zo uit:<\/p>\n<pre>var\r\n  s: IShared&lt;TStringlist&gt;;\r\nbegin\r\n  s := Shared.Make(TStringList.Create);\r\n  DoSomething(s);\r\nend;<\/pre>\n<p>We hebben een testprogramma geschreven om een complexer scenario te testen. Hier is de code van het testprogramma:<\/p>\n<pre>program TestSmartPointer;\r\n\r\n{$APPTYPE CONSOLE}\r\n\r\nuses\r\n  Spring,\r\n  Diagnostics,\r\n  Classes,\r\n  SysUtils,\r\n  System.Generics.Collections;\r\n\r\ntype\r\n  TTestObj = class\r\n  private\r\n    FDescription: string;\r\n  public\r\n    property Description: string read FDescription write FDescription;\r\n    destructor Destroy; override;\r\n  end;\r\n\r\n  TTestList = class(TList&lt;IShared&lt;TTestObj&gt;&gt;)\r\n  public\r\n    destructor Destroy; override;\r\n  end;\r\n\r\nprocedure Test_SmartPointer;\r\nvar\r\n  lTestList: IShared&lt;TTestList&gt;;\r\n  lTestObj: IShared&lt;TTestObj&gt;;\r\n  i: integer;\r\nbegin\r\n  writeln('SmartPointer test started');\r\n  lTestList := Shared.Make(TTestList.Create);\r\n  for i := 1 to 10 do\r\n  begin\r\n    lTestObj := Shared.Make(TTestObj.Create);\r\n    lTestObj.Description := i.ToString;\r\n    writeln(format('TestObj with description %s added to Testlist', [lTestObj.Description]));\r\n    lTestList.Add(lTestObj);\r\n  end;\r\n  \r\n  for lTestObj in lTestList do\r\n    writeln(format('Item %d of Testlist has value %s', lTestList.IndexOf(lTestObj), lTestObj.Description));\r\n\r\n  writeln('SmartPointer test finished');\r\nend;\r\n\r\n{ TTestObj }\r\n\r\ndestructor TTestObj.Destroy;\r\nbegin\r\n  writeln(format('TestObj with description %s is destroyed', [FDescription]));\r\n  inherited;\r\nend;\r\n\r\n{ TTestList }\r\n\r\ndestructor TTestList.Destroy;\r\nbegin\r\n  writeln('TTestList is destroyed');\r\n  inherited;\r\nend;\r\n\r\nbegin\r\n  Test_SmartPointer;\r\n  readln;\r\nend.<\/pre>\n<p>In dit programma wordt een generieke lijst TTestList gevuld met TTestObj objecten. Let op de verklaring van de TTestList:<\/p>\n<p>TTestList = class(TList&lt;IShared&lt;TTestObj&gt;&gt;)<\/p>\n<p>De uitvoer van dit testprogramma staat in de onderstaande afbeelding.<\/p>\n<p><img decoding=\"async\" class=\"img-fluid alignnone wp-image-1729 size-full\" src=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png\" alt=\"\" width=\"479\" height=\"567\" srcset=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png 479w, https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1-253x300.png 253w\" sizes=\"(max-width: 479px) 100vw, 479px\" \/><\/p>\n<p>Zoals je kunt zien zijn de objecten gefreed na de &#8216;SmartPointer-test&#8217; regel. Dus als de Test_SmartPointer procedure klaar is, vallen de lokale variabelen buiten de scope en worden ze automatisch opgeruimd. Dit werkt goed.<br \/>\nWe hebben ook de prestaties en het gebruikte geheugen getest. De resultaten zijn als volgt:<\/p>\n<p><img decoding=\"async\" class=\"img-fluid alignnone wp-image-1731 size-full\" src=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/2.png\" alt=\"\" width=\"556\" height=\"252\" srcset=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/2.png 556w, https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/2-300x136.png 300w\" sizes=\"(max-width: 556px) 100vw, 556px\" \/><\/p>\n<p>In de snelheidstest werden 100.000 lijsten gemaakt en elke lijst werd gevuld met 100 items. De smartpointers zijn 29,17% langzamer dan wanneer de klassieke techniek wordt gebruikt.<br \/>\nIn de memorytest werd 1 lijst aangemaakt met 100.000 items. Wanneer de lijst volledig gevuld was, werd het geheugen van het programma gemeten. De smartpointers gebruiken 26,94% meer geheugen dan wanneer de klassieke techniek wordt gebruikt. Dit zijn aanzienlijke verschillen.<\/p>\n<p><strong>Conclusie<\/strong><\/p>\n<p>Smartpointers werken technisch prima. De objecten worden vrijgemaakt zoals verwacht. Er is echter een aanzienlijk nadeel als het gaat om snelheid en gebruikt geheugen. Daarnaast moet elk object worden gedeclareerd met IShared&lt;object&gt; en aangemaakt met Shared.Make(object.create). Onze aanbeveling van smartpointers is dat het een beetje te veel overhead in performance en code is om te worden gebruikt als een eenvoudig te gebruiken algemene stucture voor het automatisch vrijmaken van objecten in Delphi.<\/p>\n<p>Referenties:<\/p>\n<p><a href=\"https:\/\/blog.marcocantu.com\/blog\/2018-october-Delphi-ARC-directions.html\">https:\/\/blog.marcocantu.com\/blog\/2018-october-Delphi-ARC-directions.html<\/a><\/p>\n<p><a href=\"http:\/\/blog.barrkel.com\/2008\/09\/smart-pointers-in-delphi.html\">http:\/\/blog.barrkel.com\/2008\/09\/smart-pointers-in-delphi.html<\/a><\/p>\n<p><a href=\"https:\/\/delphisorcery.blogspot.com\/2015\/01\/smart-pointers-in-delphi.html\">https:\/\/delphisorcery.blogspot.com\/2015\/01\/smart-pointers-in-delphi.html<\/a><\/p>\n<p><a href=\"https:\/\/en.delphipraxis.net\/topic\/402-smart-pointers-generics-vrs-non-generic-implementastion\/\">https:\/\/en.delphipraxis.net\/topic\/402-smart-pointers-generics-vrs-non-generic-implementastion\/<\/a><\/p>\n","protected":false},"featured_media":0,"parent":0,"template":"","class_list":["post-2058","knowledge","type-knowledge","status-publish","hentry","knowledge-category-delphi"],"acf":{"author":414,"type_hero":"compact","hero_image":1027,"hero_image_position":"","hero_title":"","hero_content":"","hero_link":null,"hero_show_h1":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Smartpointers in Delphi - GDK Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Smartpointers in Delphi\" \/>\n<meta property=\"og:description\" content=\"Zoals je misschien weet heeft Delphi geen garbare collection. ARC zal snel verwijderd worden van de niet-Windows compiler. Delphi heeft dus geen structuur voor het automatisch opruimen van objecten. We hebben onderzoek gedaan om te zien of Smartpointers geschikt zijn voor het automatisch opruimen van objecten. Het concept van Smartpointers is ontleend aan C++ en [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi\" \/>\n<meta property=\"og:site_name\" content=\"GDK Software\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-13T13:12:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"479\" \/>\n\t<meta property=\"og:image:height\" content=\"567\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi\",\"name\":\"Smartpointers in Delphi - GDK Software\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/1.png\",\"datePublished\":\"2020-05-08T14:17:55+00:00\",\"dateModified\":\"2026-01-13T13:12:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi#primaryimage\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/1.png\",\"contentUrl\":\"https:\\\/\\\/gdksoftware.com\\\/wp-content\\\/uploads\\\/2020\\\/07\\\/1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\\\/smartpointers-in-delphi#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledgebase\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Delphi\",\"item\":\"https:\\\/\\\/gdksoftware.com\\\/nl\\\/kennisbank-categorie\\\/delphi\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Smartpointers in Delphi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gdksoftware.com\\\/nl#website\",\"url\":\"https:\\\/\\\/gdksoftware.com\\\/nl\",\"name\":\"GDK Software\",\"description\":\"Zet de stip op je horizon\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gdksoftware.com\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Smartpointers in Delphi - GDK Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi","og_locale":"nl_NL","og_type":"article","og_title":"Smartpointers in Delphi","og_description":"Zoals je misschien weet heeft Delphi geen garbare collection. ARC zal snel verwijderd worden van de niet-Windows compiler. Delphi heeft dus geen structuur voor het automatisch opruimen van objecten. We hebben onderzoek gedaan om te zien of Smartpointers geschikt zijn voor het automatisch opruimen van objecten. Het concept van Smartpointers is ontleend aan C++ en [&hellip;]","og_url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi","og_site_name":"GDK Software","article_modified_time":"2026-01-13T13:12:21+00:00","og_image":[{"width":479,"height":567,"url":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Geschatte leestijd":"3 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi","url":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi","name":"Smartpointers in Delphi - GDK Software","isPartOf":{"@id":"https:\/\/gdksoftware.com\/nl#website"},"primaryImageOfPage":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi#primaryimage"},"image":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi#primaryimage"},"thumbnailUrl":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png","datePublished":"2020-05-08T14:17:55+00:00","dateModified":"2026-01-13T13:12:21+00:00","breadcrumb":{"@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi#primaryimage","url":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png","contentUrl":"https:\/\/gdksoftware.com\/wp-content\/uploads\/2020\/07\/1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/gdksoftware.com\/nl\/kennisbank\/smartpointers-in-delphi#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gdksoftware.com\/nl"},{"@type":"ListItem","position":2,"name":"Knowledgebase","item":"https:\/\/gdksoftware.com\/nl\/kennisbank"},{"@type":"ListItem","position":3,"name":"Delphi","item":"https:\/\/gdksoftware.com\/nl\/kennisbank-categorie\/delphi"},{"@type":"ListItem","position":4,"name":"Smartpointers in Delphi"}]},{"@type":"WebSite","@id":"https:\/\/gdksoftware.com\/nl#website","url":"https:\/\/gdksoftware.com\/nl","name":"GDK Software","description":"Zet de stip op je horizon","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gdksoftware.com\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"}]}},"_links":{"self":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge\/2058","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/knowledge"}],"about":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/types\/knowledge"}],"acf:post":[{"embeddable":true,"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/team\/414"}],"wp:attachment":[{"href":"https:\/\/gdksoftware.com\/nl\/wp-json\/wp\/v2\/media?parent=2058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}