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

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

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

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

13520閲覧

Releaseで実行すると例外が発生する。

KTMEI

総合スコア44

C++

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

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2017/01/12 01:23

C++初心者です。
ほぼ触ったことがないので、細かい部分も教えていただきたいです。

Debugで実行した場合、想定通りの動作をして終了するのですが、
Releaseで実行した場合、以下のエラーが出ます。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ハンドルされない例外が 0x59158B51(msvcr120d.dll)で発生しました
(実行ファイル内): 0xC0000005: 場所 0x46EA0699 の読み取り中にアクセス違反が発生しました。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ブレークポイントをはって、Debugの際とReleaseの際の違いを確認しました。

以下ソースのPropertyConfigurator.cppのconfigure関数の引数「initFileName」の
中身として文字列「log4cpp.properties」が入ってきておらず、
これが原因と考えています。

"入ってきていない"というのは、Debugの際には文字列
「log4cpp.properties」がきちんと渡ってきていますが、
Releaseの場合には、「<文字列の文字の読み取り中にエラーが発生しました。>」
となっています。

■Log.cpp(自作)

C++

1#include "stdafx.h" 2#include "Log.h" 3 4Log::Log() 5{ 6} 7Log::~Log() 8{ 9} 10 11log4cpp::Category& Log::getLogger() 12{ 13 const std::string propatiesFileName = "log4cpp.properties"; 14 log4cpp::PropertyConfigurator::configure(propatiesFileName); 15 16 return log4cpp::Category::getRoot(); 17}

■Log.h(自作)

C++

1#pragma once 2#include<log4cpp/Category.hh> 3#include<log4cpp/PropertyConfigurator.hh> 4 5class Log 6{ 7private: 8 Log(); 9public: 10 ~Log(); 11 static log4cpp::Category& getLogger(); 12};

■メインの処理(自作)

C++

1#include "stdafx.h" 2#include "Log.h" 3 4int _tmain(int argc, _TCHAR* argv[]) 5{ 6 log4cpp::Category& logger = Log::getLogger(); 7 logger.warn("Storm is coming"); 8 return 0; 9}

■Log4cppのPropertyConfiguratorImple.cpp(Log4cppをネットからダウンロード)

C++

1#include "PortabilityImpl.hh" 2#include <log4cpp/PropertyConfigurator.hh> 3#include "PropertyConfiguratorImpl.hh" 4 5namespace log4cpp { 6 7 void PropertyConfigurator::configure(const std::string& initFileName) throw (ConfigureFailure) { 8 PropertyConfiguratorImpl configurator; 9 10 configurator.doConfigure(initFileName); 11 } 12}

■質問内容①

今回の発生事象は、上記のinitFileNameに意図した
文字列「log4cpp.properties」が入ってきていない
ことが原因と考えていますが、あってますでしょうか。
(見当違いな調査をしていないかという点で確認です。)

■質問内容②
「<文字列の文字の読み取り中にエラーが発生しました。>」というのは、
なぜ発生するのでしょうか。
また、Debugで出来ていてReleaseで出来ていないのは
なぜでしょうか。

■質問内容③

今回の質問とは関連がないですが、VC++でDebugやReleaseした場合、
以下のようなフォルダ構成になりますが、

▲プロジェクト名\Debug
▲プロジェクト名\Release
△プロジェクト名\プロジェクト名\Debug
△プロジェクト名\プロジェクト名\Release

▲と△の違いとは何なのでしょうか。

log4cpp等のDLLを配置するのにどこに配置するのが正しいのかの確認です。

▲にはDebugやRelease時の実行ファイルがあるので、同じ箇所へ
DLLを配置するのかなと思ったのですが、Debugする際に、△の方に
配置する必要があるように見えたための質問です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

お手軽に下記コードでやってみました。この実験のためにはlog4cppのシミュレートはこれで十分な筈です。
(msvc 2015でトライしましたが、たぶん2013でも同じでしょう。)

C++

1#include "stdafx.h" 2namespace log4cpp 3{ 4 struct Category 5 { 6 static Category& getRoot() 7 { 8 Category instance; 9 return instance; 10 } 11 void warn(const std::string &str) 12 { 13 std::cout << "warn(" << str << ")\n"; 14 } 15 }; 16 struct PropertyConfigurator 17 { 18 static void configure(const std::string &str) 19 { 20 std::cout << "configure(" << str << ")\n"; 21 } 22 }; 23} 24 25class Log 26{ 27private: 28 Log(); 29public: 30 ~Log(); 31 static log4cpp::Category& getLogger(); 32}; 33 34Log::Log() 35{ 36} 37Log::~Log() 38{ 39} 40 41log4cpp::Category& Log::getLogger() 42{ 43 const std::string propatiesFileName = "log4cpp.properties"; 44 log4cpp::PropertyConfigurator::configure(propatiesFileName); 45 46 return log4cpp::Category::getRoot(); 47} 48 49int _tmain(int argc, _TCHAR* argv[]) 50{ 51 log4cpp::Category& logger = Log::getLogger(); 52 logger.warn("Storm is coming"); 53 return 0; 54}

"入ってきていない"というのは、Debugの際には文字列

「log4cpp.properties」がきちんと渡ってきていますが、
Releaseの場合には、「<文字列の文字の読み取り中にエラーが発生しました。>」
となっています。

これはたまたまのようです。デバッガで見るとstd::stringに_Bufと_Ptrがあり、_Bufにはでたらめな文字列が、_Ptrには"log4cpp.properties"が入っています。_Bufに文字列として表示できないコードがたまたま入っていた時に「<文字列の文字の読み取り中にエラーが発生しました。>」 と表示されるのだろうと思います。

■質問内容①

上記実験より、恐らく原因は別にあると思います。

■質問内容②

上記のように「たまたま」だろうと思います。

■質問内容③
▲と△の違いとは何なのでしょうか。

▲は恐らく正しくは、プロジェクト名ではなくソリューション名です。
1つのソリューションには複数のプロジェクトがありますから、それら全ての最終成果物が▲に入るようです。
△には各プロジェクトの中間生成物(objファイルなどなど)が入ようです。

投稿2017/01/12 02:37

編集2017/01/12 03:23
Chironian

総合スコア23272

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

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

KTMEI

2017/01/23 05:27

追加のライブラリディレクトリに、リリースモードのフォルダを追加していなかったため、 参照できずに本エラーが発生しているようでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問