Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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++中创建一个这样的自定义分配器是可能的: { // Limit memory to 1024 KB ScopedMemoryPool memoryPool(1024 * 1024); // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool. // If the pool is depleted these calls result in an exception being thrown. // Examples: std::vector<int> integers(10); int a * = new int [10]; } { //将内存限制为1024KB ScopedMemoryPool内存池(1024*1024); //从这里开始,所有堆分配('new','malloc',…)都从池中获取内存。 //如果池耗尽,这些调用将导致引发异常。 //示例: std::向量整数(10); int a*=新int[10]; }_C++_Memory Management - Fatal编程技术网

创建作用域自定义内存池/分配器? >在C++中创建一个这样的自定义分配器是可能的: { // Limit memory to 1024 KB ScopedMemoryPool memoryPool(1024 * 1024); // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool. // If the pool is depleted these calls result in an exception being thrown. // Examples: std::vector<int> integers(10); int a * = new int [10]; } { //将内存限制为1024KB ScopedMemoryPool内存池(1024*1024); //从这里开始,所有堆分配('new','malloc',…)都从池中获取内存。 //如果池耗尽,这些调用将导致引发异常。 //示例: std::向量整数(10); int a*=新int[10]; }

创建作用域自定义内存池/分配器? >在C++中创建一个这样的自定义分配器是可能的: { // Limit memory to 1024 KB ScopedMemoryPool memoryPool(1024 * 1024); // From here on all heap allocations ('new', 'malloc', ...) take memory from the pool. // If the pool is depleted these calls result in an exception being thrown. // Examples: std::vector<int> integers(10); int a * = new int [10]; } { //将内存限制为1024KB ScopedMemoryPool内存池(1024*1024); //从这里开始,所有堆分配('new','malloc',…)都从池中获取内存。 //如果池耗尽,这些调用将导致引发异常。 //示例: std::向量整数(10); int a*=新int[10]; },c++,memory-management,C++,Memory Management,我在boost库或其他任何地方都找不到类似的东西 有没有一个根本性的问题使得这不可能 有没有一个根本性的问题使得这不可能 关于程序行为的争论从根本上说是不可能的。各种奇怪的问题都会出现。代码的某些部分可能会执行,也可能不会执行,尽管这似乎不会对下一部分产生影响,而下一部分的工作可能不会受到阻碍。某些部分可能总是失败。处理标准库或任何其他第三方库将变得极其困难。有时在运行时可能会出现碎片,有时不会 是的,您可以创建这样的构造,它在许多游戏中都有使用,但您基本上需要实现自己的容器,并调用您创建的池的

我在boost库或其他任何地方都找不到类似的东西

有没有一个根本性的问题使得这不可能

有没有一个根本性的问题使得这不可能


关于程序行为的争论从根本上说是不可能的。各种奇怪的问题都会出现。代码的某些部分可能会执行,也可能不会执行,尽管这似乎不会对下一部分产生影响,而下一部分的工作可能不会受到阻碍。某些部分可能总是失败。处理标准库或任何其他第三方库将变得极其困难。有时在运行时可能会出现碎片,有时不会

是的,您可以创建这样的构造,它在许多游戏中都有使用,但您基本上需要实现自己的容器,并调用您创建的池的内存分配方法

您还可以尝试为STL容器编写一个自定义分配器,尽管这类工作通常是不可取的。(我以前做过,很乏味,但我不记得有什么具体问题。)


写下你自己的记忆分配器不是为胆小的人准备的。你可以看看,它提供了“内存空间”,你可以在你的作用域构造中使用它。

我将回答一个不同的问题。看看“高效c++”这本书。他们讨论的其中一件事就是实现这种事情。这是针对web服务器的

对于这个特定的东西,你可以通过覆盖新的并向STL提供自定义分配器来在C++层混乱。p>


或者,您可以在malloc级别进行混乱处理,从自定义malloc开始并从那里开始工作(如dmalloc)

您需要创建一个自定义分配器,并将其作为模板参数传递给vector。这个自定义分配器基本上会包装对池的访问,并执行它想要的任何大小验证。

如果意图是该范围内的所有分配都与该分配器对象一起发生,那么它本质上是一个线程局部变量

因此,如果使用
静态
或全局变量来实现它,就会出现多线程问题。否则,对于无状态的分配器来说,这不是一个很好的解决方法


(当然,您需要传递第二个模板参数,例如
vector

IMHO,即OP希望在每个范围的基础上微调分配器(可能这样他就不用编写不同的分配器和创建STL容器专门化)。一般来说,我建议不要尝试将STL容器与自主开发的内存分配例程一起使用。编写自己的内存分配系统有很多很好的理由,但它们也有相当高的成本。(是的,我看到它们的使用方式是定制分配器行为,而不管它遇到了什么,但是是的,没有标准容器,也没有使用
new
delete
、或
malloc
函数系列。)你是说这个吗?->犯错误为什么呢不能处理内存分配失败的库是一个糟糕的库。重载全局
new
delete
是一个坏主意。一般来说原因正如我所描述的。OP表示,如果内存不可用,将抛出异常。请注意,这并不意味着一个作用域的池内存耗尽必然会影响为下一个作用域定义的池
boost::pool\u分配器
boost::fast\u pool\u分配器
可以用作
std::vector
和其他容器的分配器。