我无法用C++实现简单的内存分配器

问题描述 投票:0回答:1

我正在尝试实现一个简单的分配器来使用向量,但我不明白为什么它不起作用,我找不到如何做得更好的信息,请告诉我!

输出显示“未声明的标识符”和“未找到标识符”,我不明白出了什么问题。

我问了Chatgpt,他也说了同样的话,但帮不了我。

代码

#include <vector>
#include <memory>
#include <iostream>

template<typename T>
struct Allocator
{
    using value_type = T;


private:
    size_t size_;
public:

    explicit Allocator(size_t size) : size_(size) {};
    ~Allocator() = default;

    void* allocate()
    {
        try
        {

            void* ptr = malloc(size_ * sizeof(value_type));
            std::cout << "allocate " << std::endl;
            return ptr;
        }
        catch (const exception& e)
        {
            std::cout << e.what << std::endl;
            return nullptr;
        }
    }

    void deallocate(void* ptr)
    {
        try
        {

            std::cout << "deallocate" << std::endl;
            free(ptr);
        }

        catch (const exception& e)
        {
            std::cout << e.what << std::endl;
        }
    }

    void construct(void* ptr, const value_type& value)
    {
         try
         {

             std::cout << "construct" << std::endl;
             new(ptr) value_type(value);
         }
         catch (const exception& e)
         {
             std::cout << e.what << std::endl;
         }
    }

     void destroy(void* ptr)
    {
         try
         {
             std::cout << "destroy" << std::endl;
             ptr -> ~value_type();
         }
         catch (const exception& e)
         {
             std::cout << e.what << std::endl;
         }
    }

     void* reallocate(void* ptr, size_t new_size)
     {
         try
         {
             std::cout << "reallocate" << std::endl;
             void* new_ptr = realloc(ptr, new_size * sizeof(value_type));
             if (new_ptr == nullptr)
             {
                 std::cerr << "Error reallocate" << std::endl;
             }
             return new_ptr;
         }
         catch (const exception& e)
         {
             std::cout << e.what << std::endl;
             return nullptr;
         }
     }
};



int main(int argc, char* argv[]) 
{
    std::vector<int, Allocator<int>> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
}

输出

>------ Сборка запущено: проект: CMakeLists, конфигурация: Debug ------
  [1/2] Building CXX object CMakeFiles\test2.dir\test2.cpp.obj
  FAILED: CMakeFiles/test2.dir/test2.cpp.obj 
  C:\PROGRA~1\MICROS~4\2022\COMMUN~1\VC\Tools\MSVC\1438~1.331\bin\Hostx64\x64\cl.exe  /nologo /TP   /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MDd /Ob0 /Od /RTC1 -std:c++20 -ZI /showIncludes /FoCMakeFiles\test2.dir\test2.cpp.obj /FdCMakeFiles\test2.dir\ /FS -c D:\C++\test2\test2.cpp
D:\C++\test2\test2.cpp(31): error C3861: exception: идентификатор не найден
  D:\C++\test2\test2.cpp(31): note: контекст создания экземпляра шаблона (сначала самый старый)
  D:\C++\test2\test2.cpp(98): note: выполняется компиляция ссылки на экземпляр класс шаблон функции "Allocator<T>"
D:\C++\test2\test2.cpp(31): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(47): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(47): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(61): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(61): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(74): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(74): error C2065: exception: необъявленный идентификатор
D:\C++\test2\test2.cpp(92): error C3861: exception: идентификатор не найден
D:\C++\test2\test2.cpp(92): error C2065: exception: необъявленный идентификатор
  ninja: build stopped: subcommand failed.
c++ memory memory-management stl allocator
1个回答
-1
投票

编译器错误抱怨

exception
未知。您需要添加:

#include <exception>

然后将

exception
更改为
std::exception


修复该问题后,您还需要进行一些其他更改:

  • e.what
    必须是
    e.what()

  • ptr -> ~value_type();
    必须是
    static_cast<value_type*>(ptr) -> ~value_type();

  • 您无法通过构造函数获取数组大小,因为这不是

    std::vector
    将大小传递给其分配器的地方。您需要将数组大小作为
    allocate()
    方法的参数。

您的

Allocator
类需要符合 Allocator 要求。目前还没有。

© www.soinside.com 2019 - 2024. All rights reserved.