digitalmars.D.learn - Using std.stdio.File in a class
- Spacen Jasset (25/25) Apr 08 2014 I am trying to use file in a class. It doesn't seem to work. File
- Adam D. Ruppe (5/6) Apr 08 2014 Only if they're pointers. new File returns a File*, not a File.
- Spacen Jasset (3/9) Apr 08 2014 Perhaps the new keyword doesn't do what it used to do? I'll have
- Rene Zwanenburg (3/15) Apr 08 2014 Maybe you're confused with C#? In C# you have to use new for
- Spacen Jasset (4/21) Apr 08 2014 I don't think I am confusing it with C hash. I think it's
- Adam D. Ruppe (4/5) Apr 08 2014 That's a std.stream.File which is a class (implementing the
- Steven Schveighoffer (5/29) Apr 08 2014 Just a word of caution, I don't think the RAII semantics of File work
- monarch_dodra (3/7) Apr 08 2014 RAII doesn't work correctly with GC, period.
- Spacen Jasset (7/46) Apr 08 2014 What do you mean by don't work? I can see that it won't be RAII
- Steven Schveighoffer (11/19) Apr 08 2014 The reference count inc/dec is not thread-safe, so if the GC collects yo...
I am trying to use file in a class. It doesn't seem to work. File is a struct. Are you not supposed to new structs anymore? The examples seem to use auto, but that isn't going to work in this situation. Is File a struct to take advantage of Raii? import std.stdio; class X { this() { f = new File("test2", "wt"); } File f; } void main() { X x = new X; } C:\temp>dmd file.d && file.exe file.d(7): Error: constructor std.stdio.File.this (shared(_iobuf)* handle, strin g name, uint refs = 1u, bool isPopened = false) is not callable using argument t ypes (File*) DMD32 D Compiler v2.065
Apr 08 2014
On Tuesday, 8 April 2014 at 14:52:02 UTC, Spacen Jasset wrote:Are you not supposed to new structs anymore?Only if they're pointers. new File returns a File*, not a File. But you shouldn't new a File because then the file won't be automatically closed when it goes out of scope (RAII indeed). Your code should work if you just take out the new keyword.
Apr 08 2014
On Tuesday, 8 April 2014 at 14:53:56 UTC, Adam D. Ruppe wrote:On Tuesday, 8 April 2014 at 14:52:02 UTC, Spacen Jasset wrote:Perhaps the new keyword doesn't do what it used to do? I'll have to check all this out.Are you not supposed to new structs anymore?Only if they're pointers. new File returns a File*, not a File. But you shouldn't new a File because then the file won't be automatically closed when it goes out of scope (RAII indeed). Your code should work if you just take out the new keyword.
Apr 08 2014
On Tuesday, 8 April 2014 at 15:08:17 UTC, Spacen Jasset wrote:On Tuesday, 8 April 2014 at 14:53:56 UTC, Adam D. Ruppe wrote:structs too. In D new allocates something on the GC heap.On Tuesday, 8 April 2014 at 14:52:02 UTC, Spacen Jasset wrote:Perhaps the new keyword doesn't do what it used to do? I'll have to check all this out.Are you not supposed to new structs anymore?Only if they're pointers. new File returns a File*, not a File. But you shouldn't new a File because then the file won't be automatically closed when it goes out of scope (RAII indeed). Your code should work if you just take out the new keyword.
Apr 08 2014
On Tuesday, 8 April 2014 at 15:15:37 UTC, Rene Zwanenburg wrote:On Tuesday, 8 April 2014 at 15:08:17 UTC, Spacen Jasset wrote:I don't think I am confusing it with C hash. I think it's changed. I found this in some old code I wrote years ago: scope Stream file = new File(filename);On Tuesday, 8 April 2014 at 14:53:56 UTC, Adam D. Ruppe wrote:structs too. In D new allocates something on the GC heap.On Tuesday, 8 April 2014 at 14:52:02 UTC, Spacen Jasset wrote:Perhaps the new keyword doesn't do what it used to do? I'll have to check all this out.Are you not supposed to new structs anymore?Only if they're pointers. new File returns a File*, not a File. But you shouldn't new a File because then the file won't be automatically closed when it goes out of scope (RAII indeed). Your code should work if you just take out the new keyword.
Apr 08 2014
On Tuesday, 8 April 2014 at 15:52:23 UTC, Spacen Jasset wrote:scope Stream file = new File(filename);That's a std.stream.File which is a class (implementing the Stream interface) which is a different animal from std.stdio.File, which is a struct.
Apr 08 2014
On Tue, 08 Apr 2014 10:52:01 -0400, Spacen Jasset <spacenjasset mailrazer.com> wrote:I am trying to use file in a class. It doesn't seem to work. File is a struct. Are you not supposed to new structs anymore? The examples seem to use auto, but that isn't going to work in this situation. Is File a struct to take advantage of Raii? import std.stdio; class X { this() { f = new File("test2", "wt"); } File f; } void main() { X x = new X; } C:\temp>dmd file.d && file.exe file.d(7): Error: constructor std.stdio.File.this (shared(_iobuf)* handle, strin g name, uint refs = 1u, bool isPopened = false) is not callable using argument t ypes (File*) DMD32 D Compiler v2.065Just a word of caution, I don't think the RAII semantics of File work properly in multithreaded code when the File is destroyed by the GC. -Steve
Apr 08 2014
On Tuesday, 8 April 2014 at 15:18:20 UTC, Steven Schveighoffer wrote:Just a word of caution, I don't think the RAII semantics of File work properly in multithreaded code when the File is destroyed by the GC. -SteveRAII doesn't work correctly with GC, period.
Apr 08 2014
On Tuesday, 8 April 2014 at 15:18:20 UTC, Steven Schveighoffer wrote:On Tue, 08 Apr 2014 10:52:01 -0400, Spacen Jasset <spacenjasset mailrazer.com> wrote:What do you mean by don't work? I can see that it won't be RAII anymore since there is no stack scope. However, I expect it to get closed properly - as and when the containing object is collected, or when you use the scope keyword with a class object. Is this not so?I am trying to use file in a class. It doesn't seem to work. File is a struct. Are you not supposed to new structs anymore? The examples seem to use auto, but that isn't going to work in this situation. Is File a struct to take advantage of Raii? import std.stdio; class X { this() { f = new File("test2", "wt"); } File f; } void main() { X x = new X; } C:\temp>dmd file.d && file.exe file.d(7): Error: constructor std.stdio.File.this (shared(_iobuf)* handle, strin g name, uint refs = 1u, bool isPopened = false) is not callable using argument t ypes (File*) DMD32 D Compiler v2.065Just a word of caution, I don't think the RAII semantics of File work properly in multithreaded code when the File is destroyed by the GC. -Steve
Apr 08 2014
On Tue, 08 Apr 2014 11:54:45 -0400, Spacen Jasset <spacenjasset mailrazer.com> wrote:On Tuesday, 8 April 2014 at 15:18:20 UTC, Steven Schveighoffer wrote:The reference count inc/dec is not thread-safe, so if the GC collects your object in a thread that is not the original thread, it may be racing with your thread that's simultaneously inc/dec the reference count. What can you do? 1. Single threaded program. 2. destroy the class deterministically with destroy(x); 3. Ensure the file reference is unique, do not share it with any other objects. -SteveJust a word of caution, I don't think the RAII semantics of File work properly in multithreaded code when the File is destroyed by the GC.What do you mean by don't work? I can see that it won't be RAII anymore since there is no stack scope. However, I expect it to get closed properly - as and when the containing object is collected, or when you use the scope keyword with a class object. Is this not so?
Apr 08 2014