c++ - 将 C++ vector 作为成员放入使用内存池的类中

标签 c++ memory-management heap-memory stdvector

我一直在编写一个多线程 DLL,用于使用 ADO/ODBC 进行数据库访问,以便与遗留应用程序一起使用。我需要为每个线程保留多个数据库连接,因此我将每个连接的 ADO 对象放在一个对象中,并考虑将它们的数组保留在自定义 threadInfo 对象中。显然, vector 在这里会更好——我需要在旅途中删除/重新排列对象,而 vector 会简化这一点。问题是,我正在为每个线程分配一个堆以避免堆争用和其他东西,并从那里分配我所有的内存。

所以我的问题是:如何从特定于线程的堆中分配 vector ? (或者它会在内部知道从与其包装类相同的堆分配内存 - 听起来不太可能,但我不是 C++ 人)我在谷歌上搜索了一下,看起来我可能需要编写一个分配器或其他东西 -看起来我不想做太多的工作。还有别的办法吗?我听说 vector 对其内部的所有内容都使用 placement-new,那么重载 operator new 是否可以用于它?

我对 C++ 内部知识的匮乏无济于事,因为我主要是一名 C 程序员(即便如此 - 相对而言)。我很可能在某处遗漏了一些基本的东西。如果没有更简单的事情出现 - 我可能会去做数组的事情,但希望它不会变成那样。

我正在使用 MS-VC++ 6.0(嘿,笑起来很不礼貌!:-P)。

任何/所有帮助将不胜感激。

最佳答案

how do I make the vector allocate from the thread-specific heap?

你传递给它(在编译时)一个适当的分配器。 Here 是关于如何做到这一点的经典之作。如果您遵循那篇文章的建议(或者甚至只是复制代码并在需要的地方进行调整),对于 C 程序员来说,编写分配器可能比正确地使用动态分配数组的类的复制语义更容易。

请注意,如果您将对象放入 vector (或您自己的数组,FTM)中,它们本身使用堆(例如字符串),您需要考虑它们也使用您的特殊堆。对于标准库的容器(std::basic_string<> 就是这样一个容器),这很容易,因为您也可以将它们传递给您的分配器。对于您自己的类型,您必须自己确定。

并尝试尽快摆脱​​ VC6。这是有毒的。

关于c++ - 将 C++ vector 作为成员放入使用内存池的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2570643/

相关文章:

java - Drools 知识库大小

c++ - 如何在 xpressive 中迭代命名组?

c++ - 为什么我看到在堆和堆栈上分配的数组之间存在不同的行为?

c++ - 在什么情况下会在 C++ 中使用有符号字符?

c - 链表的最大限制

c - 记录动态内存分配使用情况

c++ - 在模板类的头文件中包含 .cpp 文件

c - 瓦尔格林德 C : How to input string from stdio

java - Tomcat 7 - 我的堆转储有泄漏吗?

c++ - 指针释放和堆内存,c++