用C ++创建对象不使用“new”

时间:2010-09-16 23:17:31

标签: c++ object new-operator delete-operator

我想制作一个代表矩阵的程序 现在,矩阵将由向量中的每个对象的向量表示 代表一个单元格的例子:vector 现在,在构造矩阵时,构造函数接收要插入矩阵的单元格列表。 列表的大小在编译时未知

我有兴趣在不使用堆上的内存的情况下创建此矩阵。换句话说,不使用“新”或“删除”一词创建对象 如果我不知道有多少对象要插入到向量中,有没有办法做到这一点?

5 个答案:

答案 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”关键字。

然而,如果没有信息为什么你想避免新的/删除,很难说出什么是“好”的解决方案。 您需要动态内存分配,这两个是执行此操作的工具。

请您解释/改写您的问题,以便获得更准确的答案?