www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - &this access violation

reply Trevor Parscal <trevorparscal hotmail.com> writes:
When I do this... (compilable code)

// start of test.d //
import std.stdio;
import std.string;

class ROOT
{
	/* Members */
	public:
		BRANCH*[] Branches;
		char[] Name;

	/* Functions */
	public:
		void Add(inout BRANCH _branch)
		{
			_branch.Root = &this;
			this.Branches ~= &_branch;
		}
		void Check()
		{
			writefln("ROOT: " ~ this.Name);
			foreach(BRANCH* branch; this.Branches)
			{
				branch.Check();
			}
		}
};

class BRANCH
{
	/* Members */
	public:
		ROOT* Root;
		BRANCH*[] Branches;

	/* Functions */
	public:
		void Add(inout BRANCH _branch)
		{
			_branch.Root = this.Root;
			this.Branches ~= &_branch;
		}
		void Check()
		{
			writefln("BRANCH: " ~ this.Root.Name);
			// Access Violation happens here in 0.025
			foreach(BRANCH* branch; this.Branches)
			{
				branch.Check();
			}
		}
};

int main()
{
	ROOT root = new ROOT();
	root.Name = "test";
	BRANCH branch1 = new BRANCH();
	BRANCH branch2 = new BRANCH();

	root.Add(branch1);
	branch1.Add(branch2);
	root.Check();

	return 0;
}
// end of test.d //

It outputs this...

//////////////////
ROOT: test
BRANCH:
BRANCH:
//////////////////

In 0.025, it would give me an access violation..

I think it has to do with the "&this" not mapping to the right place. 
Maybe I am wrong.

Any ideas?

-- 
Thanks,
Trevor Parscal
www.trevorparscal.com
trevorparscal hotmail.com
Jun 19 2005
parent reply Vathix <chris dprogramming.com> writes:
On Sun, 19 Jun 2005 06:54:50 -0400, Trevor Parscal  
<trevorparscal hotmail.com> wrote:

 When I do this... (compilable code)

 // start of test.d //
 import std.stdio;
 import std.string;

 class ROOT
 {
 	/* Members */
 	public:
 		BRANCH*[] Branches;
 		char[] Name;

 	/* Functions */
 	public:
 		void Add(inout BRANCH _branch)
 		{
 			_branch.Root = &this;
 			this.Branches ~= &_branch;
 		}
 		void Check()
 		{
 			writefln("ROOT: " ~ this.Name);
 			foreach(BRANCH* branch; this.Branches)
 			{
 				branch.Check();
 			}
 		}
 };

 class BRANCH
 {
 	/* Members */
 	public:
 		ROOT* Root;
 		BRANCH*[] Branches;

 	/* Functions */
 	public:
 		void Add(inout BRANCH _branch)
 		{
 			_branch.Root = this.Root;
 			this.Branches ~= &_branch;
 		}
 		void Check()
 		{
 			writefln("BRANCH: " ~ this.Root.Name);
 			// Access Violation happens here in 0.025
 			foreach(BRANCH* branch; this.Branches)
 			{
 				branch.Check();
 			}
 		}
 };

 int main()
 {
 	ROOT root = new ROOT();
 	root.Name = "test";
 	BRANCH branch1 = new BRANCH();
 	BRANCH branch2 = new BRANCH();

 	root.Add(branch1);
 	branch1.Add(branch2);
 	root.Check();

 	return 0;
 }
 // end of test.d //

 It outputs this...

 //////////////////
 ROOT: test
 BRANCH:
 BRANCH:
 //////////////////

 In 0.025, it would give me an access violation..

 I think it has to do with the "&this" not mapping to the right place.  
 Maybe I am wrong.

 Any ideas?

You probably shouldn't even assume 'this' is an lvalue, but if it happens to be one, you don't even know where it's stored. I'm assuming it's just a local variable which doesn't exist after Add() returns. You seem to be assuming classes are handled like c++ classes. In D, classes only use references, which are pointers behind the scenes. So ROOT* is actually a pointer to a pointer. You should only need ROOT root; and set it to 'this' in Add() and all will be swell.
Jun 19 2005
parent Trevor Parscal <trevorparscal hotmail.com> writes:
Vathix wrote:
 You probably shouldn't even assume 'this' is an lvalue, but if it 
 happens  to be one, you don't even know where it's stored. I'm assuming 
 it's just a  local variable which doesn't exist after Add() returns. You 
 seem to be  assuming classes are handled like c++ classes. In D, classes 
 only use  references, which are pointers behind the scenes. So ROOT* is 
 actually a  pointer to a pointer. You should only need ROOT root; and 
 set it to 'this'  in Add() and all will be swell.

Yes, good old C++ habbits die hard. Thanks for the help. -- Thanks, Trevor Parscal www.trevorparscal.com trevorparscal hotmail.com
Jun 19 2005