我想制作一个代表矩阵的程序 现在,矩阵将由向量中的每个对象的向量表示 代表一个单元格的例子:vector 现在,在构造矩阵时,构造函数接收要插入矩阵的单元格列表。 列表的大小在编译时未知
我有兴趣在不使用堆上的内存的情况下创建此矩阵。换句话说,不使用“新”或“删除”一词创建对象 如果我不知道有多少对象要插入到向量中,有没有办法做到这一点?
答案 0 :(得分:2)
有一种特殊的方法可以使用new在堆栈中分配内存,或者使用所谓的 placement new operator 作为静态存储。使用此版本的新版本,您可以保留一大块内存,并明确告诉您要存储特定变量的新位置。它的工作原理如下:
#include <new>
int main()
{
char buffer[500]; // chunk of memory
int p*;
p = new (buffer) int[10];
}
请注意,您需要包含 new 标头才能使用此特殊的新运算符。在这种情况下,当您使用自动存储时,内存将在离开声明它的块(主要)时被释放。
参考文献:C ++ Primer plus。第9章第420页
答案 1 :(得分:1)
没有标准的方法来执行此操作而不使用汇编指令执行程序/函数的堆栈帧的直接(因此依赖于平台)操作 - 我衷心地不鼓励这样做。是什么阻止你使用堆?
答案 2 :(得分:1)
使用alloca
获取指针,然后使用就地new
运算符:
void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);
然而,在使用之前,执行阅读alloca
手册页! 要非常小心。正如Jim Brissom所说,alloca
不可携带。
您不需要delete
。当函数返回
答案 3 :(得分:1)
有一种方式,它是非常有限的,非常非正统的。您需要创建一个静态大小的unsigned char
数组,形成一个内存池。对象列表的大小将受到限制。您需要为该类重载new
运算符(和delete
运算符)以专门针对此类内存池。
那就是说,走这条路是没有充分理由的。
答案 4 :(得分:1)
好吧,如果您不想在堆上使用内存,那么您还想从哪里获取内存?
a)依赖于系统 - 您可以要求操作系统为您分配一些内存。但这是糟糕的风格(取决于系统),并将使用相同的RAM ......只是以不同的方式分配。例如,如果您真的对此感兴趣,则Windows 32中的:: GlobalAlloc或:: LocalAlloc将执行此类操作。
b)内存映射文件 - 如果你问的话可能会很有趣,因为你认为你没有足够的RAM,访问时间不是问题。c)求助于像malloc / free这样的C函数并抛出指针...即从堆中获取内存,只是避免使用“new”和“delete”关键字。
然而,如果没有信息为什么你想避免新的/删除,很难说出什么是“好”的解决方案。 您需要动态内存分配,这两个是执行此操作的工具。
请您解释/改写您的问题,以便获得更准确的答案?