0

有効に割り当てられる前にポインターが使用されると、コードが頻繁にクラッシュすることがわかりました。次に例を示します。

MyType* p = 0;
p->foo(); // crashes because p is not assigned.

if を保護するために、通常は次のようなポインターを使用する前に assert ステートメントを追加します。

assert(p);

しかし、アサーションを追加することを忘れがちです。セーフガードを行うためのより良い方法はありますか?または、クラッシュが発生したときにユーザーのコードでクラッシュを特定するのに役立つツールはありますか?

実際、私はデータを所有するためにスマート ポインターをよく使用します。生のポインターは、参照用にのみ使用されます。例えば:

std::unique_ptr<Model> p;

class View
{
public:
    View(Model* model = 0) : m_model(model) {}

    void setModel(Model* model) {m_model = model;}
    Model* model() const {return m_model;}

private:
    Model* m_model;
};

ビューのモデルを設定するのを忘れると、問題は解決しません。大きなコードでは、忘れがちです。

4

1 に答える 1

0

この種のツールとして私のお気に入りは valgrind です。開発中にプログラムを実行するvalgrind myProg...と、無効なメモリ アクセス、リークなどについて通知されます。

しかし、逆参照の前にポインターが null ではないというアサーションを追加することに関しては、とにかくプログラムが null 逆参照でクラッシュする場合、それは少し不必要に思えます。アサートを追加すると、クラッシュの理由を追跡するのが少し簡単になるかもしれませんが、より深い問題 (つまり、生ポインタの一般的な乱用または誤用) がある可能性があります。

于 2013-02-23T04:28:51.153 に答える