Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
June 06, 2015 Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Hello! I just started learning D and I come from a mostly C and C# background. Hello World was working, so I figured that I should try something more complex: a template class and si I went with a simple stack. Using dmd the code I wrote causes a segmentation fault and I am not sure why. import std.stdio; import std.container.slist; class Stack(T) { SList!(T) s; this() {} void push(T element) { s.insertFront(element); } } int main() { Stack!(int) x; writeln("1"); SList!(int) p; writeln("2"); p.insertFront(42); writeln("3"); x.push(42); writeln("4"); return 0; } This program prints the following into the console: % dmd test.d && ./test 1 2 3 zsh: segmentation fault ./test I do not understand why the normal SList works fine but the one inside the object doesn't. What am I overlooking? Best regards, Tim |
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | Tim K. wrote:
> Stack!(int) x;
x is not initialized.
`auto x= new Stack!(int);'
will do.
-manfred
|
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | On Saturday, June 06, 2015 09:44:36 Tim K. via Digitalmars-d-learn wrote: > Hello! > > I just started learning D and I come from a mostly C and C# > background. > Hello World was working, so I figured that I should try something > more complex: a template class and si I went with a simple stack. > > Using dmd the code I wrote causes a segmentation fault and I am not sure why. > > import std.stdio; > import std.container.slist; > > > class Stack(T) > { > SList!(T) s; > this() {} > void push(T element) > { > s.insertFront(element); > } > } > > int main() > { > Stack!(int) x; > writeln("1"); > SList!(int) p; > writeln("2"); > p.insertFront(42); > writeln("3"); > x.push(42); > writeln("4"); > return 0; > } > > > This program prints the following into the console: > % dmd test.d && ./test > 1 > 2 > 3 > zsh: segmentation fault ./test > > > I do not understand why the normal SList works fine but the one inside the object doesn't. What am I overlooking? >From the looks of it, you never initialized x, so it's null. So, the problem has nothing to do with SList. It's the fact that you're trying to dereference a null reference. You need to call new to allocate a Stack!int, not just declare a reference to one. void main() { Stack!int x x.push(42); } would have exactly the same problem. You need something like auto x = new Stack!int; - Jonathan M Davis |
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Manfred Nowak | On Saturday, 6 June 2015 at 10:10:15 UTC, Manfred Nowak wrote:
> x is not initialized.
>
> `auto x= new Stack!(int);'
> will do.
Thank you two.
But that leads me to another question: Why do I need to initialize x with a "new Stack" but I don't need to initialize p with a "new SList"?
Best regards,
Tim
|
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | On Saturday, 6 June 2015 at 10:16:12 UTC, Tim K. wrote:
> On Saturday, 6 June 2015 at 10:10:15 UTC, Manfred Nowak wrote:
>> x is not initialized.
>>
>> `auto x= new Stack!(int);'
>> will do.
>
> Thank you two.
> But that leads me to another question: Why do I need to initialize x with a "new Stack" but I don't need to initialize p with a "new SList"?
Because `SList` is a struct, which is a value type that is allocated where you declare it (here on the stack), while you used a class, which is a reference type and has to be allocated with `new`.
You can also turn your `Stack` type into a struct, then it works, too. (You just need to remove the constructor, which is empty anyway.)
|
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Marc Schütz | On Saturday, 6 June 2015 at 10:20:34 UTC, Marc Schütz wrote:
> Because `SList` is a struct, which is a value type that is allocated where you declare it (here on the stack), while you used a class, which is a reference type and has to be allocated with `new`.
>
> You can also turn your `Stack` type into a struct, then it works, too. (You just need to remove the constructor, which is empty anyway.)
That makes sense. I overlooked that in SList's documentation and thought it was just a regular old class, too.
Best regards,
Tim
|
June 06, 2015 Re: Segmentation fault from using SList in a class? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | On Saturday, 6 June 2015 at 10:16:12 UTC, Tim K. wrote:
> On Saturday, 6 June 2015 at 10:10:15 UTC, Manfred Nowak wrote:
>> x is not initialized.
>>
>> `auto x= new Stack!(int);'
>> will do.
>
> Thank you two.
> But that leads me to another question: Why do I need to initialize x with a "new Stack" but I don't need to initialize p with a "new SList"?
>
> Best regards,
> Tim
Best way to construct a std.container is to use std.container.make.
|
Copyright © 1999-2021 by the D Language Foundation