我想安排一些事情,对于一个类Foo,这是有效的:
Foo *f = new Foo()
Run Code Online (Sandbox Code Playgroud)
但这不是(最好是编译时错误):
Foo f;
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
具体原因是Foo实际上是一个跟踪类,可以使另一个堆分配的对象出现在脚本环境中.Foo的内部保持从脚本引用到C++对象的映射.跟踪对象将使用如下:
Thing *t = new Thing();
(new FooThing(t))->PushToScriptStack();
Run Code Online (Sandbox Code Playgroud)
如果跟踪对象在堆栈上,则指针在范围结束时变为无效,并且我在跟踪数据中留下了悬空指针.
我所有这些都运作良好,我只是想寻求一些额外的保护.
使构造函数私有,有一个create(),它将在堆上分配对象的实例并返回一个指针.你必须自己处理释放.
例如:
Foo *f = Foo::create();
Run Code Online (Sandbox Code Playgroud)
然后:
Foo::destroy(f);
Run Code Online (Sandbox Code Playgroud)