私はpTestという名前のポインタを持っています。ポインターを使用して関数が呼び出された場合、アプリケーションをただちにクラッシュさせることは可能ですか?NULLポインタの呼び出しがすぐに失敗する
0
A
答えて
4
生ポインタを使用する代わりに、逆参照をトラップする保護ポインタクラス(スマートポインタの形式)を作成できます。
#include <stdexcept>
template<typename T>
class CheckedPointer
{
T * ptr;
public:
CheckedPointer(T * init = NULL) : ptr(init) {}
T * operator->() const
{
if (ptr == NULL)
throw std::runtime_error("dereference of NULL pointer");
return ptr;
}
T & operator*() const
{
if (ptr == NULL)
throw std::runtime_error("dereference of NULL pointer");
return *ptr;
}
// ... more members to make this a useful class
};
class Test
{
public:
void Foo() {}
};
int main()
{
CheckedPointer<Test> pTest;
pTest->Foo();
}
1
あなたの質問には明確化が必要です。メソッドは、メソッドの試行
- :PTESTは、オブジェクトへのNULLポインタであり、あなたはそれのメソッドを呼び出す場合はいずれかの場合には、その後、私はあなたのVS2008は、独自にクラッシュするプログラムをコンパイル期待します
これは、意味的に静的でインスタンスメンバーにアクセスしようとしない場合、メソッド呼び出しが実際に動作する可能性があることを意味します。さらに、この種の動作は、デバッグとリリースのビルドによって異なります。
の場合は、メソッドの呼び出しの前/直後にアプリケーションをクラッシュさせたい場合、それぞれの前にアサーションまたは条件付きアボートを追加できます。または、各メソッドの先頭に(この== NULL)チェックを追加することもできます(ただし、この時点までにクラッシュを引き起こす仮想メソッドでは機能しません)。
0
例外をスローし、決してそれをキャッチしたくない場合があります。それはあなたのプログラムをクラッシュさせます。
if (pTest == NULL)
throw std::invalid_argument("null pointer");
関連する問題
- 1. 呼び出すメソッドが失敗し、フロート
- 2. log4j:ERROR setFile(null、true)呼び出しに失敗しました。
- 3. nullポインタでallocator_traits :: deallocateを呼び出す
- 4. Ormlite - コンストラクタ呼び出し失敗BaseDaoImplが
- 5. Junitメソッド呼び出しがスプリングインジェクションのために失敗する
- 6. removeEventsの呼び出し後にrenderEventが失敗する - FullCalendar
- 7. PHP CURL呼び出しがwordpress RSSフィードに失敗する
- 8. 外部API呼び出し後にWCFプロキシが失敗する
- 9. のcallocの呼び出しが失敗し、以下のコードは、呼び出し)
- 10. utility.rbのsign_upユーティリティテストメソッドの呼び出しが失敗する
- 11. __main__からのunittestsのコマンドライン呼び出しが失敗する
- 12. HTTPSのWebサービス呼び出し失敗
- 13. Neo4jClient呼び出しの失敗例
- 14. AJAX JSON呼び出しの失敗
- 15. GoogleのクラウドテストラボでWebサービス呼び出しが失敗する
- 16. jqueryからのWebAPI呼び出しが失敗する
- 17. Ajax呼び出しがFirefoxで失敗するようです
- 18. CordovaのtextStatus:errorとHTTP status 0ですぐにAjaxの呼び出しが失敗する
- 19. アスタリスク呼び出しファイルの呼び出しに失敗しました
- 20. nosetestsが失敗したときにティアダウンを呼び出す
- 21. Webサービスのリモート呼び出しが失敗します
- 22. なぜ私のAJAX呼び出しが失敗しますか?
- 23. トランクvlanへのSoftLayer API呼び出しが失敗します。
- 24. ストアドプロシージャの呼び出しがWebサービスから失敗します
- 25. SoftLayer API呼び出しのinitiatePortalPasswordChangeが失敗します。
- 26. rails 3 jquery ajax呼び出しがstatusTextで失敗する: "parsererror"
- 27. GTK + 3 OpenGL:OpenGL呼び出しが失敗する
- 28. OperaとIE8でAJAX呼び出しが失敗する
- 29. クライアントでWit.ai API呼び出しが失敗する
- 30. CreateScalableFontResource()呼び出しがWindows 10で失敗する
'pTest'は何にNULLポインタのですか?関数ポインタか、引数として渡しているのでしょうか?後者の場合、関数内で 'if(pTest == NULL)abort()'のようなことをすることができます。 –
@KeithThompsonもしそれが前者なら、それはそれ自身で爆破するはずです。 – jpm
@jpm:* *する必要がありますが、保証されていません。 –