Unexpected memory reuse

via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 31 12:28:22 PDT 2014


On Thursday, 31 July 2014 at 18:30:41 UTC, Anonymous wrote:
> module test;
> import std.stdio;
>
> class buffer(T, size_t sz) {
> 	auto arr = new T[sz];

This allocates an array with `sz` elements once _at compile 
time_, places it somewhere into the executable, and uses its 
address as the default initializer for the member `arr`. All 
instances of `buffer` (with the same template parameters) that 
you create and don't change `arr` have it point to the same 
memory.

Use this instead:

     class buffer(T, size_t sz) {
         T[sz] arr;
         enum end = sz-1;
     }

This embeds `arr` into the class, instead of making it a 
reference to a dynamic array. If you want the latter, use this:

     class buffer(T, size_t sz) {
         T[] arr;
         enum end = sz-1;
         this() {
             arr = new T[sz];
         }
     }


More information about the Digitalmars-d-learn mailing list