Thread overview | |||||
---|---|---|---|---|---|
|
June 19, 2005 &this access violation | ||||
---|---|---|---|---|
| ||||
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
|
June 19, 2005 Re: &this access violation | ||||
---|---|---|---|---|
| ||||
Posted in reply to Trevor Parscal | 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.
|
June 19, 2005 Re: &this access violation | ||||
---|---|---|---|---|
| ||||
Posted in reply to Vathix | 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 |
Copyright © 1999-2021 by the D Language Foundation