小编fis*_*her的帖子

如何将C#List中创建的对象的地址传递给C++ DLL?

我一直在寻找谷歌找到我的问题的一些答案,但不太明白我发现了什么.在使用System.IO读取一些文本文件后,我有一些在C#List中创建和存储的对象.之后,我想将这些对象中的每个对象的引用(使用const指针)发送到C++ dll中的内部类,以便它可以使用它们来计算某些算法.

以下是我正在做的一些简单示例(不是实际代码):

C#类:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class SimpleClass
{
    [MarshalAs(UnmanagedType.LPStr)]
    public string           Name;
    public float            Length;
}
Run Code Online (Sandbox Code Playgroud)

与相应的C结构:

struct SimpleClass
{
    const char* Name;
    float Length;
};
Run Code Online (Sandbox Code Playgroud)

存储在

List<SimpleClass> ItemList;
Run Code Online (Sandbox Code Playgroud)

解析一些文本文件后.

然后调用以下dll函数:

C#:

[DllImport("SimpleDLL")]
public static extern void AddSimpleReference(SimpleClass inSimple);
Run Code Online (Sandbox Code Playgroud)

C:

void AddSimpleReference(const SimpleClass* inSimple)
{
   g_Vector.push_back(inSimple); // g_Vector is a std::vector<const SimpleClass* > type
}
Run Code Online (Sandbox Code Playgroud)

我试过的是:

for(int i=0; i<ItemList.Count;++i)
{
    SimpleClass theSimpleItem = ItemList[i];
    AddSimpleReference(theSimpleItem);
}
Run Code Online (Sandbox Code Playgroud)

最初,我认为通过使用赋值运算符来获取实际的引用/地址是很容易的,因为C#中的类是通过引用传递的,但事实证明C++类总是推送相同的地址值(地址值)临时引用)进入容器而不是实际地址.如何获取实际的对象地址并将其发送到C++ DLL,以便它可以只读访问C#对象?

更新:对于那些使用不安全代码发布答案的人抱歉.我忘了提到C#代码实际上是用作Unity游戏引擎中的一个脚本,它不允许使用不安全的代码.

c# c++ dll pointers pass-by-reference

3
推荐指数
1
解决办法
2506
查看次数

有没有办法安全删除MyObject的非唯一指针的QList?

我知道这个问题已被要求死亡,但我想知道是否有任何方式做我在问题中所说的而不使用Boost库指针等.基本上我有以下一段清理代码删除指向的对象通过二维QList中的指针(QList <QList>)

#include <QList>
QList< QList<MyObject*> > m_Data;
...
void CleanupMyObjectList
{
int numFrames = m_Data.size();
for(int i=0; i < numFrames; i++)
{
    int numObjects = m_Data.at(i).size();

    for(int j=0; j < numObjects; j++)
    {
        MyObject* removedObject = m_Data[i].at(j);
        if(removedObject != NULL)
        {
            delete removedObject;//This assumes that the pointers are UNIQUE in this list!!! If not it will crash!!!
            removedObject = NULL;
        }
    }
    m_Data[i].clear();

}

m_Data.clear();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试清理由非唯一或共享(这是正确的术语?)指针填充的列表时,它确实崩溃了,例如当m_Data [0] [1]等于m_Data [1] [1]时.

我知道为什么它崩溃所以请保存解释,但我想知道是否有安全删除这些对象尽可能少的代码修改.

c++ qt list shared-ptr

0
推荐指数
1
解决办法
1144
查看次数

标签 统计

c++ ×2

c# ×1

dll ×1

list ×1

pass-by-reference ×1

pointers ×1

qt ×1

shared-ptr ×1