2

これは、C++で作成しようとするすべてのクラスで発生します。Javaから移行すると、主にクラスの作成に問題があります。valgrindを実行しましたが、コンストラクターにあります。

==30214== Memcheck, a memory error detector
==30214== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==30214== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==30214== Command: ./CoC
==30214== 
==30214== 
==30214== Process terminating with default action of signal 11 (SIGSEGV)
==30214==  Bad permissions for mapped region at address 0x404B4F
==30214==    at 0x4C2B9EC: strcat (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==30214==    by 0x404220: Model::Model(std::string) (in /home/kronus/Apollo/CoC)
==30214==    by 0x402617: main (in /home/kronus/Apollo/CoC)

ご覧のとおり、このモデルクラスのコンストラクターをmainメソッドに呼び出そうとしています。コンストラクターのコードは次のとおりです

Model::Model(std::string filename)
{
m_TotalFaces = 0;
m_model = lib3ds_file_load(filename.c_str());
    // If loading the model failed, we throw an exception
    if(!m_model)
    {
           throw strcat("Unable to load ", filename.c_str());
    }
}

呼び出されると、セグメンテーション違反で閉じます。重要:ヘッダーファイル内でクラスを宣言しました。これは私がエラーを受け取るときです。クラスをソースファイル内に配置すると、正常に実行されます。私は何が間違っているのですか?

4

2 に答える 2

9

strcat最初の引数が指す文字列の最後に、2番目の引数が指す文字列を書き込もうとします。最初の引数は文字列リテラル(読み取り専用と見なす必要があります)であるため、厄介なセグメンテーション違反が発生します。

C ++は、Javaとはまったく異なる言語であるかのように学習することをお勧めします。そうしないと、同様の機能が同じように機能すると思われる可能性があるためです。それは危険です。サルは、キーボードの顔をマッシュアップすることでJavaを学ぶことができます。C ++には未定義の動作があり、マシンでは正しく機能しているように見えるかもしれませんが、別のマシンで核ミサイルを発射します。

于 2013-03-24T06:41:00.097 に答える
2

間違った定数文字列に追加しています:

strcat("Unable to load ", filename.c_str());
         ^ you can't append to constant

これを読んでください:c ++例外:throwing std :: string文字列
自体が使用中に例外をスローする可能性があるため、文字列を例外クラスとして使用することは避けたい場合があります。

2番目:文字列リテラルをスローする場合、どのタイプをキャッチする必要がありますか?

于 2013-03-24T06:39:56.243 に答える