2016-05-01 40 views
1

未定義の動作ではなく、nullptrオブジェクトのメソッドを呼び出すときにC++でNPEをスローすることはできますか? SEGFAULTシグナル用のハンドラを作成することはできますが、すべてのSEGFAULTがNullPointerExceptionであるわけではないので、これは本当に危険です。私がif節をチェックインするだけでそれをしなければならない場合、そうする有効な方法はありますか?たぶんコンパイル時?C++でNullPointerExceptionをスローする

+1

確かに可能、質問があり、それが役に立つのですか?何かをデバッグしようとしていますか?ヌルポインタを逆参照する必要がある場合でも、あなたのプログラムは何らかの形でまだ役立つでしょうか? – Jfevold

+0

私は小さなプログラミング言語をコーディングしようとしています。私はC++にコンパイルするので、未定義の動作はしません。これをどのように処理できるか知りたいのですが。 – Exagon

+0

"nullptrオブジェクト"のようなものはありません。あなたはオブジェクトを持っているか、そうではありません。そうしないと、メンバー関数を呼び出すオブジェクトがないため、オブジェクトのメンバー関数を呼び出すことはできません。 –

答えて

2

はい、あなたは本当に良いアイデアではありません(現代のC++ポインターは、その寿命を管理するオブジェクトの中に保持されています)。

いつでもポインタを保持するクラスを定義できます。次に、operator->()を試してみると、保持されているポインタがnullptrの場合にスローされます。

template<typename T> 
class ThrowingUniquePtr 
{ 
    T* ptr; 
    public: 
     // STUFF to create and hold pointer. 

     T* operator->() 
     { 
      if (ptr) { 
       return ptr; 
      } 
      throw NullPointerException; // You have defined this somewhere else. 
     } 
}; 

class Run 
{ 
    public: 
     void run() {std::cout << "Running\n";} 
}; 
int main() 
{ 
    ThrowingUniquePtr<Run> x(new Run); 
    x->run(); // will call run. 

    ThrowingUniquePtr<Run> y(nullptr); 
    y->run(); // will throw. 
} 
+0

C++ 17では、std :: bad_optional_access例外を使用して同じ機能を提供するstd :: optionalのクラスを導入しています。 – daddesio

0

例外処理のもう一つの方法: NULLポインタを使用して関数を呼び出す

#include <iostream> 
#include <typeinfo> 
using namespace std; 

char str_NullPointer[25] = "NULL Pointer exception"; 
char str_Arithmetic[25] = "Arithmetic exception"; 

class A 
{ 
public: 
    int i = 20; 
public: 
    int function() 
    { 
     printf("Function start\n"); 

     try 
     { 
      if (this) 
      { 
       printf("value of i = %d \n", i); 
      } 
      else 
      { 
       throw str_NullPointer;   /* Exception thrown in Case 2 */ 
      } 
     } 
     catch(const int s) 
     { 
      printf("%d\n", s); 
     } 
     catch(const char* s) 
     { 
      printf("%s in %s\n", s, typeid(this).name()); /* Exception and Class Name */ 
     } 

     printf("Function end\n\n\n"); 
    } 
}; 

int main() { 
    //code 

printf("Case 1: With Pointer\n"); 
A *obj = new A(); 
obj->i = 20; 
obj->function(); 

printf("Case 2: With NULL Pointer\n"); 
delete obj; 
obj = NULL; 
obj->function(); 

return 0; 
} 

出力:

Case 1: With Pointer 
Function start 
value of i = 20 
Function end 


Case 2: With NULL Pointer 
Function start 
NULL Pointer exception in P4abcd 
Function end 
関連する問題