C++ 构造函数初始化和对象损坏

C++ 构造函数初始化和对象损坏,c++,constructor,C++,Constructor,我有下面的类结构,它最初抛出了一个segfault。我已经修复了这个问题,但不完全理解为什么代码最初是通过segfault实现的。我有一个B类,a的一个子类, 初始化后,初始化列表中的对象内部A 调用构造函数的一个Run方法,该方法调用InternalA InternalA.Start上的方法,然后再调用阻塞方法io_service_u.Run,因此B的构造函数实际上从未返回 然后,一个单独的线程将尝试访问B,并调用B->SendMsg,但是 InternalA的所有内部状态都将被破坏。我通过从

我有下面的类结构,它最初抛出了一个segfault。我已经修复了这个问题,但不完全理解为什么代码最初是通过segfault实现的。我有一个B类,a的一个子类, 初始化后,初始化列表中的对象内部A 调用构造函数的一个Run方法,该方法调用InternalA InternalA.Start上的方法,然后再调用阻塞方法io_service_u.Run,因此B的构造函数实际上从未返回

然后,一个单独的线程将尝试访问B,并调用B->SendMsg,但是 InternalA的所有内部状态都将被破坏。我通过从构造函数中删除阻塞的Run方法调用,并在之后调用它,解决了这个问题

代码告诉我InternalA对象确实得到了正确的初始化,但是当调用b->SendMsg时,InternalA完全损坏了

问题是,使用新运算符,实际地址仅在返回构造函数后才分配给B*指针,即使在我检查主线程中B的地址时,它不再为null。如果我改为malloced B,并随后调用*B=B,这仍然是一个问题,或者这是特定于体系结构的吗

class B: public A
{    
    B(): A(arg1, arg2) { Run(); }
};

class A {

   A(): InternalA()... {}

   Run() {
       InternalA.Start();
       // Method does not terminate
       io_service_.Run();
   }
};

class InternalA {

   InternalA(): io_service_(), map_(), id_(5) {}

   void Start() {
        std::cout << connections_.size() << std::endl;
   }

   void SendMsg() { 
        std::cout << connections_.size() << std::endl;
   }

   private:
      boost::asio io_service_
      std:map<X,Y> map_;
      int id_;
};

int main() {
 B* b = null;
 std::thread t([&b] {b = new B()}); // Run() method gets called
 usleep(200000);
 b->SendMsg(); // All objects in InternalA are corrupted (point to invalid addresses
}

在将值分配给b之前,必须先计算该值。在您的例子中,这个新计算B永远不会返回,所以您在另一个线程中读取B的未初始化内容


另外,一个单独的线程将尝试访问B?没有组织任何检查来确定B是否真的存在?使用这种方法,您将有许多难以发现的bug。

示例中没有未编译的线程。因此,如果构造函数不返回,程序将永远不会发送msg.constructor,应该只执行-construct初始化对象的状态。编辑以添加线程。同意初始代码是不正确和危险的,但我的理解是,新代码首先分配内存地址,在返回控制之前InternalA已经在其中设置好了,就像malloc后跟*B=B一样。现在看起来B指向的地址根本无效。B在main中声明/初始化在哪里?本地lambda中的一个到lambda主体。但是新的B从未返回:new分配内存,调用构造函数,然后,只有在构造函数返回后,才返回。由于构造函数永远不会返回,新的B也永远不会返回,B变量永远不会用指向已创建对象的指针写入-它还没有完成创建!