Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ 如何声明和使用重载池运算符delete?_C++_Arrays_Memory Management_Delete Operator_Memory Pool - Fatal编程技术网

C++ 如何声明和使用重载池运算符delete?

C++ 如何声明和使用重载池运算符delete?,c++,arrays,memory-management,delete-operator,memory-pool,C++,Arrays,Memory Management,Delete Operator,Memory Pool,我想知道如何适应阵列 基本上,我想要这样的东西: class Pool { public: void* allocate(size_t size) {...} void deallocate(void* p, size_t size) {...} }; void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); } void operator delete[](void* p, size

我想知道如何适应阵列

基本上,我想要这样的东西:

class Pool {
public:
  void* allocate(size_t size) {...}
  void deallocate(void* p, size_t size) {...}
};

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); }
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); }

struct Foo {...};

int main() {
  Pool pool;

  Foo* manyFoos = new (pool) Foo [15];

  /* ... */

  delete [] (pool) manyFoos;
}

但是,我还没有找到正确的语法来声明和调用这个
操作符delete[](pool)
。有人能帮忙吗?

先调用单个对象上的DTOR,然后使用:

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo();
operator delete[] (manyFoos, pool);
用于(int i=0;i<15;++i)多个Foo[i]->~Foo();
操作员删除[](多个oos,pool);

您可以再次阅读整个FAQ项目,您将在那里找到它。

这是不可能的。比亚恩的理由是,你永远无法正确地找到正确的游泳池。他的解决方案是:您必须手动调用所有析构函数,然后找出正确的池,以便手动释放内存

参考资料:

比亚恩常见问题解答:

相关C++标准部分:

3.7.3.2.2对于delete表达式,仅考虑具有size_t类型参数的成员运算符delete函数


5.3.5.1删除表达式语法不允许额外的参数。

对不起,我不明白。此语句如何删除数组
manyFoos
?编译器如何知道调用
操作符delete[]
,而不是
操作符delete
。修正了post。@Tobias:使用placement表单时,您需要执行编译器自动为您执行的操作——1)调用对象上的dtor;2)释放内存。第一行代码处理#1。现在,第二行注意释放代码“>池/<代码>的部分,其中数组对象来自。C++中没有<代码>放置删除< /代码>运算符。请参阅:快速参考和说明:placement delete表单不调用任何dtor,这就是我们需要显式dtor调用的原因。