【问题标题】:Instantiate structure at assigned address (allocation assignment)在分配的地址实例化结构(分配分配)
【发布时间】:2011-01-19 04:12:56
【问题描述】:

对于我正在学习的课程,我们需要开发分配实用程序。

除了安全之外,我将使用远指针来接收和分配地址给某些结构。我也不允许在这个作业中使用“memalloc”。

我指的是:Linked Lists in C without malloc 学习如何在不使用 memalloc 的情况下制作链接结构。但是,我需要知道如何将新实例分配给特定地址。例如,如果我有一个指向地址 0x5000 的起始指针,我想创建我的列表,以便我可以使用增量偏移量(例如 256)来开始我的下一个结构提前 256 个字节(就地址而言)我的出发点。

此作业基于熟悉分段和 x86 架构。

感谢任何帮助!

【问题讨论】:

    标签: c++ c memory-management allocation


    【解决方案1】:

    根据您想要做什么,您可能需要结合使用以下工具:

    Placement new:您可以使用以下语法在特定内存位置构造对象:

    new (reinterpret_cast<void*>(0x500)) MyObject(/* ...ctor args... */);
    

    这不会分配任何新内存;相反,它只是使用指定的内存地址作为接收器对象调用构造函数。小心对齐限制!

    自定义分配器。您可以按照std::allocator&lt;T&gt; 定义一个新类,在您指定的位置保留内存。然后,您可以创建自动在您想要的位置使用内存的 STL 容器。

    【讨论】:

    • 您好,感谢您的回复。我需要澄清一些事情。除了我正在创建的分配实用程序之外,我不允许使用分配实用程序。所以没有 new、delete、free 等......我更希望能够做的是创建一个指针,指向某个地址,然后在我的指针引用的指向地址处创建变量和数据结构。跨度>
    • 让我进一步提出一个问题。是否可以取消引用地址并将其转换为数据类型?
    • @user580887- 放置 new 不是内存分配技术;它就像你所描述的那样。如果您可以指向内存中的某个位置,则可以使用placement new 在该位置构造一个对象。它不会调用标准的 freestore 分配器来获取空间,并且完全相信存在足够的空间。
    • @user580887- 是的,你可以这样做,但是除非你只是存储 POD 类型(没有 ctors、dtors 或复制函数的东西),否则行为是不确定的。使用placement new 允许您这样做,同时允许处理设置和清理的构造函数和析构函数。
    • @user580887- 如果你的教授说新安置是非法的,因为它会分配,我真的不知道该怎么说;这实际上是错误的。
    【解决方案2】:

    我刚收到教授的电子邮件,我不能使用“新”运算符。只是为了仔细检查你告诉我的内容,我可能会用这个例子再次询问:

    struct example{ 
        int a; 
        struct example *next; 
    }; 
    
    void *ptr; 
    ptr = 0x5000; 
    ptr = &((example)*ptr);
    

    或者类似的东西?

    【讨论】:

    • 您将需要写example* ptr = (example*)0x5000; 以使其正常工作。这绕过了到 void* 的转换,因为毕竟您最终想要得到的是一个指向 example 对象的指针。
    • 非常感谢您的帮助。一旦我弄清楚如何投票给人们,我会为你这样做。
    猜你喜欢
    • 2021-04-19
    • 2022-11-22
    • 1970-01-01
    • 2018-02-06
    • 2016-03-12
    • 2015-07-23
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多