-4

次のヘッダーファイルがあります-

#pragma once
#include <vector>

template<int rows, int cols = rows>
class mat {
public:
    mat() : values{ rows, std::vector<double>(cols) } {
        if (rows == cols) {
            int y = 0;
            for (int x = 0; x < rows; x++) {
                values[x][y] = 1;
                y++;
            }
        }
    }
    mat(int val) : values{ rows, std::vector<double>(cols, val) } {}
    std::vector<double> &operator[](int x) {
        return values[x];
    }
private:
    std::vector<std::vector<double>> values;
};

より大きなプロジェクトとは別に、これを単独でコンパイルすると、正常に動作します。ただし、プロジェクトと一緒にコンパイルすると、Invalid address specified to RtlValidateHeap( 000001CBA8F80000, 000001CBA8F99BC0 )実行時にエラーが発生します。ヘッダー ファイルをまったく参照していなくても、このエラーが発生します。プロジェクトのヘッダー ファイルを純粋にコンパイルすると、たとえそれがまったく参照されていなくても、実行時エラーが発生します。このエラーは、main が呼び出される前に発生しているようです。メイン内にブレークポイントを設定してデバッグすることも、クラスのコンストラクター内にブレークポイントを設定してデバッグすることもできません。私もできませんstd::coutプログラムの何でも。私の知る限り、それはメインにもなりません。考えられることはすべて試しました。私はmsvcでCMakeを使用しています。しかし驚くべきことに、まったく同じヘッダー ファイルを使用してデモ プログラムを実行したところ、問題なく動作しました。すべてが意図したとおりに機能しました。必要だと思われる場合は、ここに私の CMakeLists.txt ファイルがあります-

cmake_minimum_required (VERSION 3.8)

add_executable(physics WIN32 "main.cpp" "mat.h" "vec2.h"  "poly_flags.h" "poly.h" "poly.cpp" "object.h" "object.cpp" "world.h" "world.cpp")

target_include_directories(physics PRIVATE "${CMAKE_SOURCE_DIR}/include")

target_compile_definitions(physics PRIVATE "$<$<CONFIG:Debug>:" "_DEBUG" ">" "$<$<CONFIG:Release>:" "NDEBUG" ">" "WIN32;" "_CONSOLE;" "UNICODE;" "_UNICODE")
target_compile_options(physics PRIVATE /Oi; /Gy; /permissive-; /sdl; /W2; /doc; $<$<CONFIG:Debug>:/Z7>; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; ${DEFAULT_CXX_EXCEPTION_HANDLING})

target_link_options(physics PRIVATE $<$<CONFIG:Debug>: /INCREMENTAL; /NODEFAULTLIB:LIBCMTD; /NODEFAULTLIB:MSVCRT> $<$<CONFIG:Release>: /DEBUG:FULL /OPT:REF; /OPT:ICF; /INCREMENTAL:NO> /NODEFAULTLIB:LIBCMT)

target_link_libraries(physics PRIVATE SDL2main SDL2 winmm version Imm32 Setupapi libcmt libucrtd)

target_link_directories(physics PRIVATE "${CMAKE_SOURCE_DIR}/lib")

これが私のmain.cppファイルです。ここで参照します-

mat<5> mat5;

for (int y = 0; y < 5; y++) {
    for (int x = 0; x < 5; x++) {
        std::cout << mat5[x][y] << ", ";
    }
    std::cout << std::endl;
}

少しコードを省略していますが、コードはまったく影響を与えていないことをお約束します。あいまいなコンパイラのバグ以外に、これが発生する理由は考えられません。明らかに、このクラスは完成には程遠いですが、私は過去数日間、これをデバッグしようとしました。プログラムの別の場所にメモリを割り当てていて、それを適切に削除していない、または 2 回削除していると思われるかもしれません (実行時エラーは通常、これを意味します) std::vector。別のファイルにマップする以外に意味します。

自分で試してみたい場合は、こちらのgithub リポジトリを参照してください。私が正直に言うと、あなたがそれをコンパイルすれば、すべてうまくいく可能性が非常に高いです。または、これが明らかに明らかなエラーである可能性も同様です。注: main.cpp の 30 行目以降は無関係であり、そのほとんどはおそらく意味をなさないでしょう。アプリケーションの他の部分には無数のエラーがあり、「mat.h」ファイルがないと動作しません。つまり、コンパイルはできますが、まだ機能しません。とにかく、あなたの助けを前もってありがとう、私は本当にそれを使うことができました!

反対票のおかげで-これが私が得たコールスタックです-

>   ntdll.dll!RtlpBreakPointHeap()  Unknown
    ntdll.dll!RtlpValidateHeapEntry()   Unknown
    ntdll.dll!RtlValidateHeap() Unknown
    KernelBase.dll!HeapValidate()   Unknown
    physics.exe!_CrtIsValidHeapPointer(const void * block) Line 1407    C++
    physics.exe!free_dbg_nolock(void * const block, const int block_use) Line 904   C++
    physics.exe!_free_dbg(void * block, int block_use) Line 1030    C++
    physics.exe!__acrt_free_locale(__crt_locale_data * ptloci) Line 183 C++
    physics.exe!_updatetlocinfoEx_nolock(__crt_locale_data * * pptlocid, __crt_locale_data * ptlocis) Line 240  C++
    physics.exe!_wsetlocale::__l2::void <lambda>(void)::__l5::<lambda>() Line 518   C++
    physics.exe!__crt_seh_guarded_call<void>::operator()<void <lambda>(void),void <lambda>(void) &,void <lambda>(void)>(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, _wsetlocale::__l2::void <lambda>(void)::__l5::void <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 224  C++
    physics.exe!__acrt_lock_and_call<void <lambda>(void)>(const __acrt_lock_id lock_id, _wsetlocale::__l2::void <lambda>(void)::__l5::void <lambda>(void) && action) Line 980   C++
    physics.exe!_wsetlocale::__l2::<lambda>() Line 528  C++
    physics.exe!__crt_seh_guarded_call<void>::operator()<void <lambda>(void),void <lambda>(void) &,void <lambda>(void) &>(__crt_call_and_cleanup::__l2::void <lambda>(void) && setup, _wsetlocale::__l2::void <lambda>(void) & action, _wsetlocale::__l2::void <lambda>(void) & cleanup) Line 224   C++
    physics.exe!__crt_call_and_cleanup<void <lambda>(void),void <lambda>(void)>(_wsetlocale::__l2::void <lambda>(void) && action, _wsetlocale::__l2::void <lambda>(void) && cleanup) Line 238   C++
    physics.exe!_wsetlocale(int _category, const wchar_t * _wlocale) Line 531   C++
    [Inline Frame] physics.exe!call_wsetlocale(const int category, const char * const narrow_locale) Line 30    C++
    physics.exe!setlocale::__l2::<lambda>() Line 41 C++
    physics.exe!__crt_seh_guarded_call<char *>::operator()<void <lambda>(void),char * <lambda>(void) &,void <lambda>(void)>(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, setlocale::__l2::char * <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 204 C++
    [Inline Frame] physics.exe!__acrt_lock_and_call(const __acrt_lock_id) Line 976  C++
    physics.exe!setlocale(int _category, const char * _locale) Line 118 C++
    [External Code] 
    physics.exe!_initterm(void(*)() * first, void(*)() * last) Line 22  C++
4

1 に答える 1