Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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++ 如何在C++;_C++_Memory Management - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,memory-management,C++,Memory Management,我正在研究一个无锁的数据结构,我一直在检查代码,但我似乎不知道如何将内存分配器合并到我的类文件中 template<class KEY, class VALUE> class DataStruc{ public: 模板 类数据结构{ 公众: 我以前从未使用过自定义内存分配器,我很难理解如何合并它。您只需要为类实现运算符new()。您的实现应该从分配器的实例获取内存 在类的头文件中,需要声明分配/解除分配运算符: public: void * operator new(si

我正在研究一个无锁的数据结构,我一直在检查代码,但我似乎不知道如何将内存分配器合并到我的类文件中

template<class KEY, class VALUE>
class DataStruc{
public:
模板
类数据结构{
公众:

我以前从未使用过自定义内存分配器,我很难理解如何合并它。

您只需要为类实现运算符new()。您的实现应该从分配器的实例获取内存

在类的头文件中,需要声明分配/解除分配运算符:

public:
    void * operator new(size_t size);
    void * operator delete(void * obj, size_t size);
    void * operator new[](size_t size);
    void * operator delete[](void * obj, size_t size);
然后你需要实现它们。在某个地方你需要实例化一个分配器;也许只是在你实现这些运算符的文件中将其设置为静态。然后,只需查看该网站上的API文档,你就会执行如下操作。我放入断言,因为我看不到如何将对象大小传递给该分配器;这种效果意思是你的班级最好不要成为其他班级的家长

static cds::details::Allocator<YourClass> allocator;

void * YourClass::operator new(size_t size) { 
    assert size == sizeof(YourClass);
    return allocator.New();
}

void * YourClass::operator new[](size_t size) { 
    return allocator.NewArray(size/sizeof(YourClass));
}

void YourClass::operator delete(void * object, size_t size) { 
    return allocator.Delete(object);
}

void YourClass::operator delete[](void * object, size_t size) { 
    return allocator.DeleteArray(object, size/sizeof(YourClass));
}
staticcds::details::分配器分配器分配器;
void*YourClass::运算符new(大小){
断言大小==sizeof(您的类);
返回分配器.New();
}
void*YourClass::运算符new[](size\u t size){
返回allocator.NewArray(size/sizeof(YourClass));
}
void YourClass::运算符delete(void*对象,大小){
返回分配器。删除(对象);
}
void YourClass::operator delete[](void*对象,大小){
返回allocator.DeleteArray(object,size/sizeof(YourClass));
}

我对断言和划分不太满意,但已经很晚了,我很累。也许其他人知道一种更优雅的方法,可以让这些API更好地匹配。但这是可行的。

阅读这篇文章,了解如何实现自定义内存分配系统:


他的帖子是关于开放源码Ogre3D图形库中实现的自定义内存分配系统的。你可以下载它的源代码,看看它是如何在那里实现的。关于我提到的库,你能给我一个代码示例吗?我的代码必须分配一个结构书和指向该书的指针数组。谢谢UCH免责声明:除了从30秒的网站浏览中学到的知识外,我对该库一无所知。但我会编辑我的答案以添加一些代码,假设该网站上的声明是有效和正确的。这就是我所需要的,我真的不知道从哪里开始,非常感谢,我会让你知道集成是如何进行的!