调试:自动检查是否(this == NULL)

时间:2013-03-10 13:55:42

标签: c++ visual-studio-2010 visual-studio

在Visual Studio 2010中是否有办法自动捕获在NULL对象上调用成员函数的错误?或许有一些标志,它在每个成员函数的乞讨时都有适当的断言?

默认行为是静默接受它,并且只在访问字段时崩溃。但在某些情况下,如果比原始错误要晚得多。


编辑:知道 NULL指针上的调用成员函数调用未定义的行为。这是我想要根除的代码中的一个错误。我希望Visual Studio有一些可以帮助我的非标准工具。

5 个答案:

答案 0 :(得分:2)

不,但是如果你完全接受RAII并且只使用C ++ 11智能指针(从不明确地调用删除),你将很难遇到这样的错误。

答案 1 :(得分:2)

不,这没用。

NULL指针上调用成员函数会调用未定义的行为。顾名思义,此时您无法确定行为。

具体做法是:

void MyObject::foo() {
    if (this) { throw std::logic_exception("this is NULL"); }

    std::cout << "Hello, world!\n";
}

任何符合标准的编译器都可以合理地改变:

void MyObject::foo() {
    std::cout << "Hello, world!\n";
}

因为,毕竟标准保证this首先不会为空!

然而,可以做的是不依赖于“裸”指针:

template <typename T>
class Pointer {
public:
    Pointer(): _ptr(nullptr) {}
    Pointer(T* t): _ptr(t) {}

    T* operator->() const { assert(_ptr); return _ptr; }
    T& operator*() const { assert(_ptr); return *_ptr; }

private:
    T* _ptr;
};

然后像使用指针一样使用它:

int main() {
    Pointer<MyObject> value = container.find("Element");
    value->foo();
}

如果它为null,那么在尝试调用foo之前会触发断言。

答案 2 :(得分:1)

您可以检查this是否为NULL,但如果您在MSVS中运行,则应考虑DebugBreak - 选项,以强制调试中断来调查堆栈。这可能会导致错误最有效。我从Release compiles中删除了检查,因为在没有调试器的情况下运行该代码会使您的应用程序自行挂起,因为没有调试器可以告诉它继续。为了避免这个问题,你可以考虑isDebuggerPresent()。

#ifdef DEBUG
#define CHECK() if (this==NULL) DebugBreak();
#else
#define CHECK() 
#endif

IsDebuggerPresent:

MSDN上的

DebugBreak:

答案 3 :(得分:0)

我不知道检查这个的任何特殊选项,但你可以轻松编写一个宏:

 #define CHECK_THIS()  assert(this)

 #define CHECK_THIS() do { if (this == NULL) { std::cerr << "'this' is NULL at " \
                             << __FILE__ << ":" << __LINE__ << " in " << __func__; \
                             exit(2); } while(0)

(它使用“do - while”,因此它可以放在任何地方而不会干扰其他if语句等)。

然后在任何相关功能中添加CHECK_THIS()

答案 4 :(得分:0)

自动 - 我不知道,但你总是可以使用断言:

assert(this);

至于this并且考虑到它是一个引用“callee”类实例的关键字 - 它怎么可能是NULL?通过NULL指针调用?