如何判断变量是指针/构造函数抛异常

Posted 学习只为旅行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断变量是指针/构造函数抛异常相关的知识,希望对你有一定的参考价值。







基本类型可以识别,但是自定义类类型呢?不能识别

核心思想:只匹配,不运行!!!这样就不会崩溃了

#include <iostream>
#include <string>

using namespace std;

class Test
{
public:
    Test()
    {
    }
    virtual ~Test()
    {
    }
};

template
<typename T>
char IsPtr(T* v) // match pointer
{
    return 'd';
}

int IsPtr(...)  // match non-pointer
{
    return 0;
}

#define ISPTR(p) (sizeof(IsPtr(p)) == sizeof(char))
//编译器在编译期间,就知道实际匹配哪一个函数,而不会实际去调用!
//通过确认这个函数将会返回的数据类型的大小确认调用了哪一个函数

int main(int argc, char *argv[])
{
    int i = 0;
    int* p = &i;
    
    cout << "p is a pointer: " << ISPTR(p) << endl;    // true
    cout << "i is a pointer: " << ISPTR(i) << endl;    // false
    
    Test t;
    Test* pt = &t;
    
    cout << "pt is a pointer: " << ISPTR(pt) << endl;    // true
    cout << "t is a pointer: " << ISPTR(t) << endl;    // false
    
    return 0;
}





但是面试官就想在构造函数中抛出异常,那么怎么处理呢?

#include <iostream>
#include <string>

using namespace std;

class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
        
        throw 0;
    }
    virtual ~Test()
    {
        cout << "~Test()" << endl;
    }
};

int main(int argc, char *argv[])
{
    Test* p = reinterpret_cast<Test*>(1);
    
    try
    {
        p = new Test();
    }
    catch(...)
    {
        cout << "Exception..." << endl;
    }
    
    cout << "p = " << p << endl;
    
    return 0;
}


对象创建失败,连空指针都不会返回
使用内存泄漏查看工具:

0 bytes in 0 blocks,说明没有泄漏,对象被回收了

小结

以上是关于如何判断变量是指针/构造函数抛异常的主要内容,如果未能解决你的问题,请参考以下文章

dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量

如何处理构造函数的失败?

构造函数中的变量初始化速度不够快,无法防止 html 代码中的空指针异常 [Angular]

c++ 构造函数抛异常

dotnet C# 如果在构造函数抛出异常 析构函数是否会执行

访问冲突指针错误