tanya library 0.2.0

Eugene Wissner via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Wed Feb 22 10:57:26 PST 2017


On Wednesday, 22 February 2017 at 13:00:19 UTC, Kagamin wrote:
> On Sunday, 19 February 2017 at 11:41:44 UTC, Eugene Wissner 
> wrote:
>> realloc() can move memory and if an object of type A has 
>> references to other objects in the array, the objects will be 
>> corrupted. "A" should be a POD-type. Otherwise you have to 
>> allocate new memory, initialize it, copy the objects by one 
>> and deallocate the old memory. Now there is 
>> IAllocator.expand().
>
> What's the difference between realloc+postblit and copy one by 
> one? Postblit is called only after copy, it's not a constructor.

The difference is that realloc will deallocate the old memory 
before postblit.
For the sake of example:

struct Sample
{
	Sample* sample;

	this(this)
	{
		sample.sample = &this;
	}
}

void main()
{
	auto s = new Sample[2];

	s[0].sample = &s[1];
	s[1].sample = &s[0];
}

Now suppose s[0] has the address 7fc8d2717000, s[1]: 7fc8d2717008.
Realloc cannot reallocate in place and after the call to realloc 
s[0] has the address 7f27771e0000 and s[1]: 7f27771e0000. It is 
too late to call the postblit here, Sample.sample refers to 
invalid memory.


More information about the Digitalmars-d-announce mailing list