有没有办法断言在调用方法之前是否已正确构造对象?

cwm*_*wm9 0 c++ constructor

我在代码中遇到了这种奇怪的无指针情况,现在想知道是否有办法检测它(除了崩溃).代码设法进入未构造对象的方法.当构造b1时,尚未构造a,并且b尝试使用它.在构造b2时,a被正确构造并且代码按预期工作.

除了显而易见的,"不要在你的代码中执行此操作",我想知道是否有一种方法可以在编译或运行时检测到这一点.编译器根本没有检测到它,我刚刚得到一些关于在程序崩溃时初始化DLL时运行托管代码的一些模糊和非常无益的消息.

我试图测试"this",但它不是NULL,因为内存已被赋值 - 只是构造函数没有被调用,所以内存处于不确定状态.

我原本以为编译器会坚持使用某些调试代码来检测何时发生这种情况,但我猜不会.

是否有任何断言或测试或编译时间开关我可以用来检测这种情况,或者它只是归结为"如果它疼,不要那样做?"

 OUTPUT:
 (NULL)
 test

#include "stdafx.h"
#include "cstring"

class Apple 
{
    char *sometimesinitialized;

    public:
    Apple () { 
        sometimesinitialized = new char[15];
        strcpy_s(sometimesinitialized, 5, "test");
    };
    void test()
    {
        printf("%s\n", sometimesinitialized);
    }
};

class Ball
{
    public:
    Ball();
};

Ball b1; // OOPS!
Apple a;
Ball b2; // Works as expected

Ball::Ball()
{
    a.test();
}

int _tmain(int argc, _TCHAR* argv[])
{
    scanf_s("%i");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sta*_*ked 5

如果B需要访问它的实例的实例A应该传递给它B的构造函数.

struct B {
    B(A &a) {
        a.test();
    }
};


A a;
B b(a);
Run Code Online (Sandbox Code Playgroud)