Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 空指针调用立即失败_C++_Visual Studio 2008 - Fatal编程技术网

C++ 空指针调用立即失败

C++ 空指针调用立即失败,c++,visual-studio-2008,C++,Visual Studio 2008,我有一个名为pTest的空指针。如果使用指针调用函数,是否可能使应用程序立即崩溃 你的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃: 该方法是虚拟的 该方法尝试访问实例成员 这意味着,如果方法调用在语义上是静态的,并且不尝试访问实例成员,那么它实际上可以工作。此外,这种行为在调试版本和发布版本之间有所不同 但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件

我有一个名为pTest的空指针。如果使用指针调用函数,是否可能使应用程序立即崩溃

你的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃:

  • 该方法是虚拟的
  • 该方法尝试访问实例成员
  • 这意味着,如果方法调用在语义上是静态的,并且不尝试访问实例成员,那么它实际上可以工作。此外,这种行为在调试版本和发布版本之间有所不同


    但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件中止。或者,您可以在每个方法的开头添加一个(this==NULL)检查(但这对虚拟方法不起作用,虚拟方法会在到达此点之前触发崩溃)。

    您的问题需要澄清。如果pTest是指向某个对象的空指针,并且您在该对象上调用了一个方法,那么我希望您的VS2008编译程序在以下情况下自行崩溃:

  • 该方法是虚拟的
  • 该方法尝试访问实例成员
  • 这意味着,如果方法调用在语义上是静态的,并且不尝试访问实例成员,那么它实际上可以工作。此外,这种行为在调试版本和发布版本之间有所不同


    但是,如果您希望在尝试调用方法之前/之后直接使应用程序崩溃,那么您可以在每次调用之前添加断言或条件中止。或者,您可以在每个方法的开头添加一个(this==NULL)检查(但这对在到达此点之前触发崩溃的虚拟方法不起作用)。

    您可能希望抛出一个异常,但永远不会捕获它。那会使你的程序崩溃

    if (pTest == NULL)
      throw std::invalid_argument("null pointer");
    

    你可能想抛出一个异常,却永远也抓不到它。那会使你的程序崩溃

    if (pTest == NULL)
      throw std::invalid_argument("null pointer");
    

    您可以创建一个受保护的指针类(智能指针的一种形式)来捕获取消引用,而不是使用原始指针

    #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();
    }
    
    #包括
    模板
    类检查指针
    {
    T*ptr;
    公众:
    CheckedPointer(T*init=NULL):ptr(init){}
    T*运算符->()常量
    {
    如果(ptr==NULL)
    抛出std::runtime_错误(“空指针的取消引用”);
    返回ptr;
    }
    T&运算符*()常数
    {
    如果(ptr==NULL)
    抛出std::runtime_错误(“空指针的取消引用”);
    返回*ptr;
    }
    //…更多的成员使其成为一个有用的类
    };
    课堂测试
    {
    公众:
    void Foo(){}
    };
    int main()
    {
    检查指针测试;
    pTest->Foo();
    }
    

    您可以创建一个受保护的指针类(智能指针的一种形式)来捕获取消引用,而不是使用原始指针

    #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();
    }
    
    #包括
    模板
    类检查指针
    {
    T*ptr;
    公众:
    CheckedPointer(T*init=NULL):ptr(init){}
    T*运算符->()常量
    {
    如果(ptr==NULL)
    抛出std::runtime_错误(“空指针的取消引用”);
    返回ptr;
    }
    T&运算符*()常数
    {
    如果(ptr==NULL)
    抛出std::runtime_错误(“空指针的取消引用”);
    返回*ptr;
    }
    //…更多的成员使其成为一个有用的类
    };
    课堂测试
    {
    公众:
    void Foo(){}
    };
    int main()
    {
    检查指针测试;
    pTest->Foo();
    }
    

    pTest
    是指向什么的空指针?它是函数指针还是作为参数传递的东西?如果是后者,您可以在函数中执行类似于
    If(pTest==NULL)abort()
    的操作。@KeithThompson,如果是前者,它应该自己爆炸。@jpm:应该爆炸,但不能保证。您可以在函数中添加“assert(this);”。它在技术上不合法,但在您的平台上有效。@DavidSchwartz:为什么它在技术上不合法?
    pTest
    是指向什么的空指针?它是函数指针还是作为参数传递的东西?如果是后者,您可以在函数中执行类似于
    If(pTest==NULL)abort()
    的操作。@KeithThompson,如果是前者,它应该自己爆炸。@jpm:应该爆炸,但不能保证。您可以在函数中添加“assert(this);”。它在技术上是不合法的,但在你的平台上是有效的。@DavidSchwartz:为什么它在技术上是不合法的?