質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3939閲覧

C++/CLIでstd::filesystem::removeでSystem.Runtime.InteropServices.SEHExceptionが投げられてしまう件について

tettyA

総合スコア93

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/07/10 05:23

編集2021/07/10 06:27

C++/CLIで、あるファイルを削除するプログラムを作りたく、以下のような概要のコードを書きました。

C++

1std::string directoryname = "C:\hoge"; 2System::String^ filename = "fuga.txt"; 3std::string path = directoryname + "\" + MarshalString(filename); 4if (std::filesystem::exists(path)) { 5 std::filesystem::remove(path); 6}

C++

1 2std::string MarshalString(System::String^ s) { 3 using namespace System::Runtime::InteropServices; 4 const char* chars = 5 (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); 6 Marshal::FreeHGlobal(System::IntPtr((void*)chars)); 7 return chars; 8}

(MarshalString()Microsoft Docsから持ってきたのを少し改変したものです。)

これをVisualStudioで実行すると、std::filesystem::remove(path)の部分で
System.Runtime.InteropServices.SEHException: '外部コンポーネントが例外をスローしました。'

とでてしまいます。
一体何が原因か全くわかりません。ファイルもexists()で確かめている筈なのになぜ例外が発生してしまうのでしょうか。

何故、例外が発生してしまうのでしょうか。また、その解決策はなんでしょうか。
Microsoftの公式を見てもよくわからず、質問するに至りました。
どなたかご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/07/10 05:40

C#は関係ないですよね
tettyA

2021/07/10 06:27

そうでした... ついいつもの癖で。 すいません
dodox86

2021/07/10 08:18

そもそもなぜ、C++/CLIと普通のC++を一緒にして操作するのでしょうか。どちらかに統一すれば無用なトラブルが避けられるのですが。
dodox86

2021/07/10 08:19

せめてお使いのVisual Studioや.NET Framework、Windowsのバージョンも詳細に示した方が良いと思います。(その際は本欄ではなく、質問文中に追記ください)
tettyA

2021/07/10 08:36

VisualStudioのバージョン:16.0.31313.79 .Net FrameWork :4.7.2 Windows10:2004 C#のIO.Delete()だとほかのプロセスが使用中だと削除できないからです。 std::filesystem::remove()だと削除できるので。
guest

回答2

0

そのMarshalStringでFreeHGlobalした文字列ポインタを返すのNGですよ。戻りのstd::stringが構築される時にはその文字列ポインタは、触ると死ぬ状態になってるんですよ。(で、案の定触って死んでAccessViolation(SEH)とかでているんでしょう)
FreeHGlobal呼ぶ前に、返すstd::stringを構築する必要がありますね。

投稿2021/07/10 11:25

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tettyA

2021/07/11 06:07

ありがとうございました! FreeHGlobalする前にstd::stringを構築すると時々起こっていた(読み込みが失敗する)バグも発生しなくなりました。 本当にありがとうございました。
guest

0

ベストアンサー

ファイルが書込み禁止等で削除できない状態になっていないでしょうか。
例外発生時VisualStudioの変数表示で_Errorを確認すれば原因がわかると思います。
イメージ説明

あと、作法的にメモリをフリーした後でcharsを参照するのあまり良くないと思います。

C++

1 Marshal::FreeHGlobal(System::IntPtr((void*)chars)); 2 return chars;

投稿2021/07/10 11:16

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tettyA

2021/07/11 06:06

ありがとうございます! _Errorを確認すると_Sharing_violation(32)とあり、やはり該当ファイルを使用中だったのが原因でした。 また、メモリをフリーしていたのも原因でした。 matukesoさんの回答も大いに参考になりました。 が、今回は先に回答してくださった方をベストアンサーにしました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問