ipconfig /renewすると出る。
VMware Toolsのサービスを再起動すると直る。
ipconfig /renewすると出る。
VMware Toolsのサービスを再起動すると直る。
プロジェクトのRootNamespaceとリソースのネームスペースが違うとでる。プロジェクト名を変更したりネームスペースを変更すると、古い名前のままのリソースが見つからずに出る。
プロジェクトファイルや設定でRootNamespaceを確認し、それにすべてあわせる。
VC6の素のwin32プロジェクトが前提。
プログラムの最初のほうで以下を書く
ここではStdAfx.cppに書いた。_CrtSetDbgFlagを呼ぶことでプログラム終了時にリークがあると以下のように出力される。
ここにファイル名を表示させたりもできるが今回はスルー。上記の{47}に注目してコードの先頭で以下のように書く。
こうするとリークするアロックのときブレークするのでコールスタックからリーク位置が分かる。
これで判明するのはmalloc, calloc, realloc, newなどのCRT関連で、HeapAllocやSysAllocStringなどは対象外。
上のテキストを拡張子.regで保存して実行する。Explorer.exeを再起動するか、いったんサインアウトする。
違いはない。ただしstrlenとは違う。
stringは自分でサイズを持っているのでNUL文字を含むことができる。strlenなどの関数はNULまでを数えて返すが、size()やlength()は自分で管理しているサイズを返す。
メモ
VC2010
コピペ https://msdn.microsoft.com/ja-jp/library/vstudio/abx4dbyh%28v=vs.100%29.aspx
C run-time library (without iostream or standard C++ library) | Associated DLL | Characteristics | Option | Preprocessor directives |
---|---|---|---|---|
libcmt.lib | None, static link. | Multithreaded, static link | /MT | _MT |
msvcrt.lib | msvcr100.dll | Multithreaded, dynamic link (import library for MSVCR100.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP100.DLL to run. | /MD | _MT, _DLL |
libcmtd.lib | None, static link | Multithreaded, static link (debug) | /MTd | _DEBUG, _MT |
msvcrtd.lib | msvcr100d.dll | Multithreaded, dynamic link (import library for MSVCR100D.DLL) (debug). | /MDd | _DEBUG, _MT, _DLL |
msvcmrt.lib | None, static link | C Runtime static library. Used for mixed managed/native code. | /clr
/clr:oldSyntax |
|
msvcurt.lib | None, static link | C Runtime static library compiled as 100% pure MSIL code. All code complies with the ECMA URT spec for MSIL. | /clr:pure |
コピペ https://msdn.microsoft.com/en-us/library/abx4dbyh%28v=vs.100%29.aspx
Characteristics | Option | Preprocessor directives | |
---|---|---|---|
LIBCPMT.LIB | Multithreaded, static link | /MT | _MT |
MSVCPRT.LIB | Multithreaded, dynamic link (import library for MSVCP100.dll) | /MD | _MT, _DLL |
LIBCPMTD.LIB | Multithreaded, static link | /MTd | _DEBUG, _MT |
MSVCPRTD.LIB | Multithreaded, dynamic link (import library for MSVCP100D.DLL) | /MDd | _DEBUG, _MT, _DLL |
コピペ https://msdn.microsoft.com/en-us/library/b0084kay.aspx
_M_CEE | Defined for a compilation that uses any form of /clr (/clr:oldSyntax, /clr:safe, for example). |
_M_CEE_PURE | Defined for a compilation that uses /clr:pure. |
_M_CEE_SAFE | Defined for a compilation that uses /clr:safe. |
コピペ C:\Program Files\Microsoft Visual Studio 9.0\VC\include\use_ansi.h
libcmt.libにスタティックにリンクする。Cランタイムコードは自分のEXEやDLLに埋め込まれる。DLLでは普通はこれを使わない。このオプションを指定するとコンパイラは_MTをdefineする。C++ソースコードはこのフラグによってC++ランタイムをpragma comment(lib…)でリンクする。/MTの場合はlibcpmt.libがリンクされる。これはスタティックライブラリで自分のEXEにCPPコードが埋め込まれる。
イ ンポートライブラリmsvcrt.libにリンクする。実行時にmsvcr100.dllにリンクされる。Cランタイムコードはmsvcr100.dll にある。DLLを作るときは通常これを使い、そうして作られたDLLを使うEXEをリンクするときも/MDを使う。そうすればランタイムが共有される。コンパイラは_MTと_DLLをdefineしその結果msvcprt.libがリンクされる、これはインポートライブラリで意実行時にmsvcp100.dllにリンクされる。/MDを使いCPPのリンクはスタティックで行いたいときは_STATIC_CPPLIBを定義する。
‘/clr’ と ‘/MT’ は同時に指定できないので、/MDになる。
pureをつけるとCランタイムがリンクされない。あとは不明
詳しくは調べていない。W系の関数ならLCIDは無視すると思いたいが、マニュアルにはそう書いてないように見える。CStringはstd::wstringでも動くはず。
セクション.CRT$XIUに関数ポインタを置く。これは自分で書く。
CRTはCRT$XIAとCRT$XZに__xi_a,__xi_zを置く。
セクションはリンク時にまとめてアルファベット順に並べられるので、__xi_aと__xi_zに挟まれた領域にある関数ポインタを全部呼び出すことでコンストラクタを呼び出す。
グローバルインスタンスのコンストラクタを誰が呼ぶか?
Visual C++コンパイラはコンストラクタのポインタをセクションのCRT$XCUに置く。
CRTはCRT$XCAとCRT$XCZに__xc_a,__cx_zを置く。
C++のグローバルインスタンスのデストラクタはおそらくatexitの機能と同様に呼ばれる。グローバルな場合はインスタンスが置かれてる順番で登録されるが複数ファイルにまたがるときの順番は不明。staticの場合はコンストラクタが実行された後のタイミングで登録される。
上で示したセグメントでやる呼ぶ方法もあるが同じなのでスルー
https://msdn.microsoft.com/ja-jp/library/bb918180.aspx
http://www.codeguru.com/cpp/misc/misc/applicationcontrol/article.php/c6945/Running-Code-Before-and-After-Main.htm#page-1
devenv.exe /ResetSettings
devenv.exe /ResetSkipPkgs
devenv.exe /Setup
devenv.exe /SafeMode