小编Kim*_*aru的帖子

在没有Malloc/New或Free/Delete的情况下管理连续的内存块

如何在没有C++中其他内存管理器(如Malloc/New)的帮助下,如何创建自定义MemoryManager来管理给定的连续内存块?

这里有一些更多的背景:

   MemManager::MemManager(void* memory, unsigned char totalsize)
   {
       Memory = memory;
       MemSize = totalsize;
   }
Run Code Online (Sandbox Code Playgroud)

我需要能够使用MemManager分配和释放这个连续内存的块.构造函数以字节为单位给出块的总大小.

Allocate函数应该以字节为单位占用所需的内存量,并返回指向该内存块开头的指针.如果没有剩余内存,则返回NULL指针.

Deallocate函数应该接收指向必须释放的内存块的指针,并将其返回给MemManager以备将来使用.

请注意以下约束:

- 除了给它的内存块,MemManager不能使用任何动态内存

- 最初指定,MemManager不能使用其他内存管理器来执行其功能,包括new/malloc和delete/free

我已经在几次面试中收到了这个问题,但即使是几个小时的在线研究也没有帮助我,我每次都失败了.我已经找到了类似的实现,但它们都使用了malloc/new,或者是来自操作系统的通用和请求的内存,我不允许这样做.

请注意,我很乐意使用malloc/new和free/delete,并且使用它们时遇到的问题很少.

我尝试过以LinkedList方式利用节点对象的实现,这些实现指向分配的内存块并说明使用了多少字节.然而,在这些实现中,我总是被迫在堆栈中创建新节点并将它们插入到列表中,但是一旦它们超出范围,整个程序就会因地址和内存大小丢失而中断.

如果有人对如何实现这样的事情有某种想法,我将非常感激.提前致谢!

编辑:我忘了在我的原始帖子中直接指定这个,但是用这个MemManager分配的对象可以是不同的大小.

编辑2:我最终使用了同源内存块,由于下面的答案提供的信息,实际上很容易实现.没有指定有关实现本身的确切规则,因此我将每个块分成8个字节.如果用户请求超过8个字节,我将无法提供,但如果用户请求少于8个字节(但> 0),那么我会给予额外的内存.如果传入的内存量不能被8整除,那么最后会浪费内存,我认为这比使用更多内存要好得多.

c++ memory contiguous

6
推荐指数
1
解决办法
992
查看次数

Perl通过推入子程序修改参考数组

我有一个我想在子程序中修改的数组.它作为第二个参数通过引用传入.它似乎没有被修改,因为当我返回时,数组的长度与原始值相同.

这是我所做的一小部分:

sub readLine
{
    my @array = @{$_[1]};
    #Push value onto array
    push @array, $myvalue;
}

sub main 
{
    my @array = ();
    #Pass by reference
    readLine($argument1, \@array);

    print @array; #Prints 0
}
Run Code Online (Sandbox Code Playgroud)

我是Perl的新手,所以如果我正确地做这件事,请告诉我.我读了类似问题的答案,但仍然没有为我打印正确的值(1).我安装了最新版本的Perl.

arrays perl pass-by-reference

1
推荐指数
1
解决办法
748
查看次数

标签 统计

arrays ×1

c++ ×1

contiguous ×1

memory ×1

pass-by-reference ×1

perl ×1