C++ 如何传递C+的地址+;对象到C
我正在使用Visual Studio 2013和C++11。我想把C++对象的地址传给C。C代码将它当作不透明的句柄;C永远不会引用它。唯一的用途是将它传递回C++,在那里它将再次被用作指向对象的指针。 <>我发现如果我在C++中创建对象并将它传递给C,对象将被破坏,因为它超出了范围。作为解决方法,我创建了一个全局变量来保存对象,这样在返回C时它就不会被破坏。最佳做法是什么?我是否应该使用引用计数指针类型,例如C++ 如何传递C+的地址+;对象到C,c++,c,object,garbage-collection,destroy,C++,C,Object,Garbage Collection,Destroy,我正在使用Visual Studio 2013和C++11。我想把C++对象的地址传给C。C代码将它当作不透明的句柄;C永远不会引用它。唯一的用途是将它传递回C++,在那里它将再次被用作指向对象的指针。 我发现如果我在C++中创建对象并将它传递给C,对象将被破坏,因为它超出了范围。作为解决方法,我创建了一个全局变量来保存对象,这样在返回C时它就不会被破坏。最佳做法是什么?我是否应该使用引用计数指针类型,例如共享\u ptr?怎么用?我不喜欢铸造成大小的想法 下面是一个试图证明这个问题的例子。代码
共享\u ptr
?怎么用?我不喜欢铸造成大小的想法
下面是一个试图证明这个问题的例子。代码不起作用
extern "C" _declspec(dllexport) void __stdcall SwbHttpListenW(const wchar_t *route, SwbHttpListen **listener)
{
*listener = &SwbHttpListen(route); // new will work but how about without new?
}
< >编辑代码重新请求使用<代码>新< /代码> .< /p> 如何使用新操作符分配C++对象,并使用AMPANDER(&)运算符获取其地址通过对对象进行堆分配,可以确保在实际使用delete操作符之前不会删除该对象,并且该地址可以作为int存储/传递
一个简单的例子:
int main() {
Person *a = new Person("Paul");
doSomething(a); //Passes the memory address of a to the function doSomething
//...and once you're finished using the object, you have to:
delete a;
return 0;
}
当你做这种事情时,总是会很乱,你如何处理它取决于你希望C++对象的生命是什么,并且在较小程度上,你最终将如何摆脱它。但是显然C++必须做任何破坏,你不能让C来做。
这类事情是一个例子,说明拥有全局对象并不一定是件坏事——当然,这意味着你不能自由地摆脱它。或者,你可以用新的方法动态创建它,但是你需要在C和C++之间进行一个安排,这样它在正确的时间被删除——你可能会得到一个全局对象指针,或者C可以通过指针返回它被破坏——这是最好的解决方案。收集器正在使用中(可能在C++中)<代码>标准::声明可访问
,标准::未声明可访问
可能有帮助。否则,问题并不在于将指针传递给C。您需要开发某种方法,在必要的地方实现指向有效对象的正确指针…:-) 如果使用
new
分配对象,则对象不会超出范围,因此不会被销毁。。。永远(除非您稍后正在调用delete
)。(指向它的指针超出范围,但如果没有将其副本保存在其他位置,则可能会发生内存泄漏,这不是一个因素。)这使您的问题很难理解。Arg。我无意中发现了答案,但没有意识到。我只需要意识到我用new
重写解决了这个问题。不管怎样,我不知道答案,如果没有新的。我正在编辑问题以反映这一点。如果您的范围将要关闭,那么在该范围之外创建对象就是解决方案,使用new
通常是应用它的方法。有没有人没有新的答案?似乎可以使用shared_ptr或诸如此类的方法来解决这个问题。您对对象所在位置的选择是:在代码块中(可能存在范围问题)、作为全局变量、或动态分配,或在另一个对象中(具有相同选项)。不管你有什么类型的指针,如果对象本身被破坏,那么指针就不再有效。唯一的选择是复制对象,而不是指向它的指针。此代码不正确newperson(“Paul”)
将返回一个Person*
。没有必要使用a
的地址,因为它已经是一个指针。但是当你使用new堆分配时,你从new得到的已经是对象的地址了,所以你不需要使用&…哇,对我来说太晚了。对不起,密码不好,该睡觉了。