- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题的实质是:
在 c 函数中创建新对象并将对该新对象的一些引用传递给调用者的最佳方法是什么?
我的整体设置有点复杂,涉及混合的 c 和 c++ 代码,所以我包括一些背景信息:
我正在为 3D 引擎创建一个 C++ 库。该库旨在供不同平台上的主机应用程序使用。
出于简单的兼容性原因,我现在打算将所有 C++ 代码隐藏在普通 C 中的 API 后面。到目前为止,这工作得很好。
我唯一不确定的是,这是通过我的 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);
我希望 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);
这行得通。 myEngineCreate()
为我提供了一个指向我的引擎实例的不透明指针,我可以在后续的绘图调用中使用它,也可以将其交给我的释放函数,在我完成它时清理内存.这种方法的问题是,我的探查器提示 myEngineCreate()
中存在内存泄漏。我知道在一个地方创建一个对象并在另一个地方拥有它是一件微妙的事情,我似乎在这里做错了什么 - 但是呢?
在此先感谢您的任何建议或帮助。
最佳答案
让我们使用您的 myEngineCreate
函数:
void myEngineCreate(void * myEngine) {
myEngine = new Engine;
}
这不起作用,因为 myEngine
是 myEngineCreate
函数范围内的局部变量。要在 C 中“通过引用”传递指针,您必须将其作为指向指针的指针传递,并使用 derefernece 运算符分配给指针:
void myEngineCreate(void ** myEngine) {
*reinterpret_cast<Engine**>(myEngine) = new Engine;
}
然后您可以使用指针的地址运算符 &
来调用它:
void * myEngine;
myEngineCreate(&myEngine);
作为后期附录,另一种可能的解决方案是返回新指针:
void* myEngineCreate() {
retur reinterpret_cast<void*>(new Engine);
}
关于c++ - 如何在 c 函数中创建一个新对象并将引用传递给它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408921/
我是一名优秀的程序员,十分优秀!