存储

时间:2016-06-30 18:31:46

标签: c memory-management dll

我被赋予了创建具有许多功能的DLL的任务。函数的具体实现实际上非常简单,但一般(或更好:初始)设置让我头疼,我还没有理解它。所以这是我应该实现的两个(很多)函数:

long initClient(long* client, char* a = "", char* b = "");
long clientSet(int client, const char* a, const char* b);

第一个函数将设置一个客户端(可能有0..n,每个客户端都有内部状态数据),所以不知何故它需要在内部跟踪客户端相关数据。现在每当我调用clientSet(第二个函数)时,我需要传递整数值(long * client),我从initClient传递给函数,以便它可以识别正确的客户端数据结构并更改那些数据。

现在的实际问题是:我该如何正确地做到这一点?

我目前的解决方案是保存客户端的内部列表及其关联的数据/ ID,并在添加或删除客户端时使用malloc / free。然而,我觉得这不是一个干净的解决方案,或者它可以以更好的方式解决。

非常感谢您的帮助。

编辑:重新思考后,可能是clientSet的第一个参数实际上是我从initClient(第一个参数)得到的指针吗?如果是这种情况,initClient只需要malloc一些内存并用数据填充。所有其他调用只会引用该内存区域。然而,我发现为同一个指针使用不同的数据类型非常麻烦(我得到一个指向long的指针,然后我需要将其解释为int - 我知道它们都是Win32上的4个字节)。我在这儿吗?

编辑#2:不幸的是我不允许以任何方式更改界面。

编辑#3:在更多地思考这个问题后,也许这就是我实际上的目标:

intptr_t my_ptr;

long initClient(intptr_t* client, char* a, char* b);
long clientSet(intptr_t client, char* a, char* b);

initClient(& my_ptr,“A”,“B”)基本上(我需要看看如何正确地进行解引用)做一个

*client = (intptr_t)malloc(sizeof(myDataStructure));

现在我可以打电话了

clientSet(my_ptr, "X", "Y");

这看起来可能是我应该做的吗?

2 个答案:

答案 0 :(得分:2)

您需要导出C函数,但您可以使用C ++实现它们。在这种情况下,您可以使用所有需要的容器和数据类型(std :: map,std :: string)来保存每个客户端的数据。如你所见,没有任何malloc:

struct client {
  std::string a;
  std::string b;
};

std::map<long, client> clients;

extern "C" {
  long initClient(long* clientid, char* a = "", char* b = "") {
    // if you need generate clientid you can use static atomic long
    static std::atomic_long id(0);
    clients[*clientid = ++id] = client{ a, b };
    return *clientid;
  }
  long clientSet(int clientid, const char* a, const char* b) {
    clients[clientid] = client{ a, b };
    return clientid;
  }
}

答案 1 :(得分:0)

经过认真考虑(以及一些讨论),我们决定采用以下方式:

  • initClient创建一个malloc的内存区域,并返回指向该实例的指针(然后将其用作int,这可能是未来的一个问题,但目前正在讨论中)
  • 所有功能都适用于该malloc区域
  • 添加了一个额外的endClient函数,它释放了保留的内存空间。

显然,这里的真正问题是使用int作为指针的存储。