Emscripten绑定的C++结构体构造函数是否保证成员零初始化?
Emscripten绑定C++结构体的成员初始化问题
当将C++结构体按如下方式绑定到Emscripten时:
struct Foo { int n; };
绑定代码:
#include <emscripten/bind.h> using namespace emscripten; EMSCRIPTEN_BINDINGS(myproject) { class_<Foo>("Foo") .constructor<>() .property("n", &Foo::n); }
在JavaScript中使用new Foo()构造实例时,constructor<>()声明是否能保证n成员被初始化为零?我推测它会调用C++的Foo()或new Foo(),因此应该会初始化,但找不到相关确认资料。
回答
不能保证n被初始化为零,具体原因如下:
- 你定义的
Foo结构体没有显式声明构造函数,C++会自动生成默认构造函数,但这个默认构造函数对int这类内置类型成员不会执行初始化操作,n会处于未定义的垃圾值状态。 - Emscripten的
constructor<>()确实会调用C的默认构造函数(等价于执行new Foo()),但受限于C本身的规则,n不会被自动置为0。
如果需要确保n初始化为0,有两种可靠方式:
- 给
Foo添加显式默认构造函数,主动初始化n:struct Foo { int n; Foo() : n(0) {} // 显式初始化成员n为0 }; - 利用C++的值初始化特性,修改绑定代码使用
constructor<emscripten::val>(),在JS中调用new Foo()时触发值初始化(不过第一种方式更直观,代码可读性更强)。
内容的提问来源于stack exchange,提问作者Detheroc
相关产品推荐
相关产品推荐

