- ベストアンサー
結局 deleteしないとダメ? ファイナライザー万能主義は理解不足?
mizmizの回答
- mizmiz
- ベストアンサー率45% (46/101)
gcnewで確保したオブジェクトはどの時点で処分されるかわかりません。おそらくはアプリケーションで必要がなくなった時点ですが、リアルタイムに行われるわけではないと思います。 メモリーに余裕があればアプリケーションの終了までほっておかれる可能性がありますのでcloseを呼び出さない可能性があり、終了時には処理されると思いますが他の処理との前後関係も保証されません。 私も.Netに移行して間がないので細かいことを説明するだけの経験と知識に欠けるので十分な説明とは言えませんが。それにC++で長いことプログラムを書いてきてC++/CLIの違和感に耐え切れえずにC#に移行した口ですので(笑)。 おそらく変な例外ダイアログメッセージと書かれているものの内容がわかればもう少しいい説明ができるかもしれません。 たとえばメッセージの内容をそのままググってみれば何かわかると思いますよ(わたしもよく使う手です)。 C++/CLIではdeleteが必要でないというのは理解として間違いないと思いますが、このようなクラス設計に問題がありそうです。 close処理は明示的に確実に実行されるように設計するべきだと思います。ファイナライザーは後始末はしなければならないデータがあるけど適当なタイミングがないような処理に使うべきでしょう。ファイルのI/Oなどアプリケーションの外部に影響があるような処理は明示的に行った方がいいと思います。
関連するQ&A
- C# StreamReader,StreamWriter による文字化
C# StreamReader,StreamWriter による文字化け お世話になります。 文字化けで悩んでいます。 Visual Studio 2008 C# にて、テキストファイルからデータを読んで別のテキストファイルに そのまま書き出す(もちろん実際の運用では加工するわけですが)処理で文字化けが起こります。 そのテキストファイル自身を C# で作れば問題はないのですが、メモ帳を使って書き込んだファイルでは 文字化けが起こります。 対処方法があれば教えてください。 以下はその実験に使ったコードです。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // これは正常に書き込みできました StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw.WriteLine("これはてすとです。"); sw.WriteLine("This is test."); sw.Close(); // これも正常に読み込め、書き込みもできました StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest.txt"); while (!sr.EndOfStream) { sw.WriteLine(sr.ReadLine()); } sr.Close(); sw.Close(); // 次はあらかじめメモ帳で作ったファイルを読んで、別のファイルに書き出します // これが文字化けします sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test2.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest2.txt"); while (!sr.EndOfStream) { string dat = sr.ReadLine(); sw.WriteLine(dat); Console.WriteLine(dat); } sr.Close(); sw.Close(); } } }
- ベストアンサー
- C・C++・C#
- ファイルの排他
ログの出力/照会時の排他処理について、教えて下さい。 環境 言語:VC++/CLI OS:Win VISTA 前提 ログ出力 ・APL起動時にログファイルをオープンする。 (基本的にはオープンしっぱなし) ・メッセージ受信などイベント取得時にログに書き込む。 (複数スレッドからの書込み処理あり) ・最大行数に達したら、ファイルをクローズして、 新規にファイルをオープンしてそちらに書き込む。 (aaa_1.log, aaa_2.log,・・・という具合) ログ照会 ・画面からボタン押下で今まで書き込んだログを照会する。 ・ログ照会時はオープン→リード→クローズとなります。 質問 複数スレッドから書込み処理がある場合に備えて排他をかける 「読み込み時に書込み発生(EOFがおかしくなるとか)」や 「書込み時に読み込み発生(行の半端なところで表示されるとか)」など、バッティングした際を考慮した排他のかけ方 について注意点があればご教授頂きたいのですが・・・ 単純に以下のような実装イメージでよろしいのでしょうか? //////////////////////////////////// 書込み処理 //変数定義 StreamWriter^ sw = nullptr; 起動時 メソッド1 sw = gcnew StreamWriter( "TestFile.txt" ); 最大行数に達したら メソッド2 sw->Close(); sw = gcnew StreamWriter( "TestFile2.txt" ); //イベント発生 メソッド3 //排他処理 sw->WriteLine( "aaaa" ); //排他解除 //////////////////////////////////// //////////////////////////////////// 照会処理 //n=ファイルサイズを求めておく; //排他処理 StreamReader^ sr = gcnew StreamReader( "TestFile.txt" ); array<Char>^c = nullptr; while ( sr->Peek() >= 0 ) { c = gcnew array<Char>(n); sr->Read( c, 0, c->Length ); //ある理由でReadLineが //使えそうにないです //理由を説明すると //長くなりそうなので //省かせて下さい //画面出力領域 ← c } sr->Close(); //排他解除 //////////////////////////////////// 以上、宜しくお願い致します。
- 締切済み
- C・C++・C#
- VC++でSELECT文の実行結果を表示
開発環境は OS XPのHomeEditon Visual C++ ExpressEdition SQL Server 2005 Express です。 よろしくお願いします。 #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <string> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; char a; void sub( SqlDataReader ^objRd ) { System::Diagnostics::Debug::WriteLine(objRd); while( objRd->Read() ) { System::Diagnostics::Debug::WriteLine(objRd->Read()); } } int main(void){ String^ str; SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\SOUTUKEN\\TEST.mdf;Integrated Security=True;User Instance=True"); sqlConn->Open(); str = "SELECT * FROM table1"; SqlCommand^ sqlCmd = gcnew SqlCommand(str,sqlConn); SqlDataReader^ exeReader = sqlCmd->ExecuteReader(); sub( exeReader ); sqlConn->Close(); } これの実行結果がboolean形で帰ってくるのですがこれを表内のデータが帰ってくるようにしたいのです。 少し知識不足なところもありますがどうかよろしくお願いします。
- ベストアンサー
- C・C++・C#
- パイプを用いた通信 C#とMATLAB
パイプを使用しC#から送信したデータをMATLABで受信することは可能でしょうか? もし可能であるならばどのようにすればよいのでしょうか。 以下のプログラムで行っているのですがMATLAB側で受信ができず -1がかえってきてしまいます C言語で受信する場合はうまくいくのですがMATLABを使用するとファイルのopneができません。 以下C#・MATLABプログラム C# <プログラム> 送信側 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; namespace PipeTest { class Program { static void Main(string[] args){ Console.WriteLine("パイプ接続待ち..."); NamedPipeServerStream pipe = new NamedPipeServerStream("test"); pipe.WaitForConnection(); Console.WriteLine("送信(キーを押すと終了)"); StreamWriter stw = new StreamWriter(pipe); stw.AutoFlush = true; while(Console.KeyAvailable == false) { stw.WriteLine("This is a test"); System.Threading.Thread.Sleep(500); } Console.WriteLine("終了"); pipe.Close(); } } } MATLAB <プログラム> 受信側 fp = fopen('C:\\\\.\\pipe\\test');
- ベストアンサー
- その他(プログラミング・開発)
- VB.NETのUsingキーワードの使い方
毎々参考にさせていただいております。 早速ですが質問させていただきます。 あるフォームでボタンが押された時に、下記の3つの処理でログを出力したい場合なのですが。 a) ボタンが押されたイベント処理 b) ボタンが押されたイベント処理の中で呼ばれるTestFunction1の中 c) ボタンが押されたイベント処理の中で呼ばれるTestFunction2の中 複数のメソッドに参照されるということで、StreamWriterのオブジェクトはインスタンスフィールドに宣言しています。 Public Class Test 'StreamWriter型のフィールド宣言 Private _sw As System.IO.StreamWriter 'ボタンクリックイベント処理 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me._sw = New System.IO.StreamWriter(filePath) Using Me._sw Me._sw.WriteLine("Button1はクリックされました") Me.TestFunction1() Me.TestFunction2() End Using End Sub Private Sub TestFunction1() 'TODO:ここに処理 If Me._sw IsNot Nothing Then Me._sw.WriteLine("TestFunction1は処理されました。") End If End Sub Private Sub TestFunction2() 'TODO:ここに処理 If Me._sw IsNot Nothing Then Me._sw.WriteLine("TestFunction2は処理されました。") End If End Sub End Class 目的とする処理は実現されているのですが、このようなUsingの使い方は問題ないのでしょうか? どなたかに御回答いただければうれしく思います。よろしくお願いいたします。 環境は下記のような感じです。 環境IDE:Visual Studio 2005 言語 :Visual Basic
- ベストアンサー
- Visual Basic
- 【VC++2005(CLR)】ファイル書き込み時、他でファイルが開かれていると落ちる
いつも大変お世話になっています。 VC初心者です。 現在、ファイル書き込み処理で悩んでいます。 他のユーザがファイルをオープンしてたり、開こうとすると 落ちてしまいます。 たとえば、ファイルが開かれていることを検知して、 ユーザに「ファイルを閉じてください」とメッセージを出した後、 再度書き込み処理を実行できませんでしょうか。 (書き込み中は他のユーザからのアクセスを拒否させたいです。) 現在以下のようなソースを書いています。 //ファイルオープン System::IO::StreamWriter^ sw = gcnewSystem::IO::StreamWriter( path_w,false,System::Text::Encoding::Default); //ファイル書き込み String^ newData = "aaa"; sw->WriteLine(newData); //ファイルクローズ sw->Close(); お手数ですが、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- Visual C++ 2008 Express Editionでファイル出力プログラムができない。
今、Visual C++ 2008 Express Editionを使って、データをファイル出力保存するプログラムを作る練習をして、下のURL http://homepage3.nifty.com/ishidate/vcpp08_2/vcpp08_2.htm ここで紹介されている通りのプログラムを組んで見たのですが、コンパイルが完了して、デバッグしてみると、DOSプロンプトが立ち上がった時点で、”動作を停止しました。”という感じで起動ができませんでした。 // C880.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; using namespace System::IO; int main() { String^string1; StreamWriter^swriter1=gcnew StreamWriter("A:sample.txt"); string1=" 二乗 三乗 四乗 平方根"; swriter1->WriteLine(string1); string1="---------------------------------------"; swriter1->WriteLine(string1); for(int a=1;a<11;a++){ string1=String::Format("{0,2} {1,5} {2,5} {3,6} {4,7:F4}", a,a*a,a*a*a,a*a*a*a,Math::Sqrt(a)); swriter1->WriteLine(string1); } swriter1->Close(); //これを忘れてはいけない Console::Read(); return 0; } これは何が原因なのかご存じの方いらっしゃいますでしょうか。ぜひご教授ねがいます。
- ベストアンサー
- C・C++・C#
- Visual C++ 2010 のファイル書き出し
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { String^ string1; string1=""; StreamWriter^ swriter1=gcnew StreamWriter("C:sample005.txt"); swriter1->WriteLine(string1); swriter1->Close(); } Visual C++ 2010 のWindowsフォームアプリケーションで、 ボタンのクリックからファイルを書き出したいのですが、上記ではエラーが出て動きません どのようにすれば良いのでしょうか?
- 締切済み
- C・C++・C#
- 異なるソリューションの連結について教えてください。
プログラミング初心者です。 開発環境 OS XP HomeEdition Visual C++ Express Edition ソリューションAのCPPファイル #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } ソリューションBのCPPファイル #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <string> using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; int main(void){ String^ str; SqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\SOUTUKEN\\TEST.mdf;Integrated Security=True;User Instance=True"); sqlConn->Open(); str = "SELECT * FROM table1 "; //str= "INSERT INTO table1 (test) VALUES(3)"; SqlCommand^ sqlCmd = gcnew SqlCommand(str,sqlConn); SqlDataReader^ exeReader = sqlCmd->ExecuteReader(); while( exeReader->Read() ) { System::Diagnostics::Debug::WriteLine(exeReader["test"]->ToString()); } sqlConn->Close(); } です。ソリューション間の連結するのはどうしたらいいですか?
- ベストアンサー
- C・C++・C#
- クライアント上のC++でサーバーとソケット送信
クライアント(Windows7)上でC++を使って、サーバー側(Windows)に対してデータを送りたいです (ソケット通信?)。 サーバ受信側はC#を使ったプログラムで以下のような感じで考えてます。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int port = 2222; System.Net.IPAddress ip = IPAddress.Parse("127.0.0.1"); System.Net.Sockets.TcpListener server = new TcpListener(ip, port); Console.WriteLine("Enter押してください"); ConsoleKeyInfo info = Console.ReadKey(); if (info.Key == ConsoleKey.Enter) { Console.WriteLine("サーバー待機中"); server.Start(); TcpClient client = server.AcceptTcpClient(); NetworkStream ns = client.GetStream(); StreamWriter sw = new StreamWriter(ns); Console.WriteLine(sw); } } } } C++のことがよくわかってないので、送信側でC++を使ってどのように 送信すればいいのかわかりません。 送信するデータはINT型で、1秒間に1回、繰り返し送ります。 よろしくお願いします。
- ベストアンサー
- C・C++・C#