Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何传递C+的地址+;对象到C_C++_C_Object_Garbage Collection_Destroy - Fatal编程技术网

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?怎么用?我不喜欢铸造成大小的想法 下面是一个试图证明这个问题的例子。代码

我正在使用Visual Studio 2013和C++11。我想把C++对象的地址传给C。C代码将它当作不透明的句柄;C永远不会引用它。唯一的用途是将它传递回C++,在那里它将再次被用作指向对象的指针。 <>我发现如果我在C++中创建对象并将它传递给C,对象将被破坏,因为它超出了范围。作为解决方法,我创建了一个全局变量来保存对象,这样在返回C时它就不会被破坏。最佳做法是什么?我是否应该使用引用计数指针类型,例如
共享\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得到的已经是对象的地址了,所以你不需要使用&…哇,对我来说太晚了。对不起,密码不好,该睡觉了。