我的问题的实质是:
在ac函数中创建新对象的最佳方法是什么,并将该对象的一些引用传递给调用者?
我的整体设置有点复杂,涉及混合的c和c ++代码,所以我要包含一些背景信息:
我正在为3D引擎创建一个c ++库.该库旨在从不同平台上的主机应用程序中使用.
出于兼容性方面的原因,我现在打算在普通c中隐藏API背后的所有c ++代码.到目前为止,这非常有效.
我唯一不确定的是,这是通过我的c API 实际创建我的引擎实例的最佳方式.
我的第一个方法是:
// in myEngineAPI.h
void myEngineCreate(void * myEngine);
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void myEngineCreate(void * myEngine) {
myEngine = new Engine; // <- this doesn't seem to work as expected
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = NULL;
myEngineCreate(myEngine); // <- problem: myEngine is still NULL after this line.
// ...draw some fancy stuff...
myEngineRelease(myEngine);
Run Code Online (Sandbox Code Playgroud)
我希望这myEngineCreate(void * myEngine)会分配我新创建的对象的地址myEngine.但是在函数返回后,myEngine仍然指向NULL.为什么?
现在我的第二种方法是:
// in myEngineAPI.h
void * myEngineCreate();
void myEngineRelease(void * myEngine);
// in myEngineAPI.cpp
#include "myEngineAPI.h"
#include "myPrivateCppEngine.h"
void * myEngineCreate() {
return new Engine; // <- ok, the function returns a valid pointer
}
void myEngineRelease(void * myEngine) {
delete ((Engine *)myEngine);
}
// in my host application
#include "myEngineAPI.h"
void * myEngine = myEngineCreate(); // <- yay, I have a void pointer to my engine
// ...draw some fancy stuff...
myEngineRelease(myEngine);
Run Code Online (Sandbox Code Playgroud)
这有效.myEngineCreate()给了我一个指向我的引擎实例的不透明指针,我可以在后续的绘图调用中使用它,我也可以将其发送给我的释放函数,当我完成它时清理内存.这种方法的问题是,我的探查器抱怨内存泄漏myEngineCreate().我知道在一个地方创建一个对象并在另一个地方拥有它是一件微妙的事情,我似乎在这里做错了什么 - 但是什么呢?
提前感谢任何建议或帮助.
让我们来看看你的myEngineCreate功能:
void myEngineCreate(void * myEngine) {
myEngine = new Engine;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它myEngine是myEngineCreate函数范围内的局部变量.要在C中传递"通过引用"指针,您必须将其作为指向指针的指针传递,并使用derefernece运算符指定给指针:
void myEngineCreate(void ** myEngine) {
*myEngine = new Engine;
}
Run Code Online (Sandbox Code Playgroud)
你通过使用&指针的address-of运算符来调用它:
void * myEngine;
myEngineCreate(&myEngine);
Run Code Online (Sandbox Code Playgroud)