C++ 在C+中创建对象+;不使用;新";

C++ 在C+中创建对象+;不使用;新";,c++,object,new-operator,delete-operator,C++,Object,New Operator,Delete Operator,我想做一个程序,比如说,表示一个矩阵 现在矩阵将由向量表示,向量中的每个对象将 表示一个单元格示例:vector 现在,当构造矩阵时,构造函数会收到一个要插入矩阵的单元格列表列表的大小在编译时未知 我感兴趣的是在不使用堆内存的情况下创建这个矩阵。换句话说,不使用“新建”或“删除”创建对象 如果我不知道有多少对象要插入到向量中,有什么方法可以做到这一点吗?如果不使用汇编指令对程序/函数的堆栈帧执行直接(因此依赖于平台)操作,就没有标准的方法可以做到这一点,对此我极力反对。是什么阻止了您使用堆?如果

我想做一个程序,比如说,表示一个矩阵 现在矩阵将由向量表示,向量中的每个对象将 表示一个单元格示例:vector 现在,当构造矩阵时,构造函数会收到一个要插入矩阵的单元格列表列表的大小在编译时未知

我感兴趣的是在不使用堆内存的情况下创建这个矩阵。换句话说,不使用“新建”或“删除”创建对象
如果我不知道有多少对象要插入到向量中,有什么方法可以做到这一点吗?

如果不使用汇编指令对程序/函数的堆栈帧执行直接(因此依赖于平台)操作,就没有标准的方法可以做到这一点,对此我极力反对。是什么阻止了您使用堆?

如果不使用汇编指令直接(从而依赖于平台)操纵程序/函数的堆栈框架,就没有标准的方法可以做到这一点,我衷心反对这样做。是什么阻止您使用堆?

使用
alloca
获取指针,然后使用就地
新建
操作符:

void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);
但是,使用前请阅读
alloca
手册页非常小心。正如Jim Brissom所说,
alloca
是不可移植的


您不需要
删除
。当函数返回时,内存将被释放。请使用
alloca
获取指针,然后使用在位
new
运算符:

void *p = alloca(sizeof(Class));
new (p) Whatever(arguments);
但是,使用前请阅读
alloca
手册页非常小心。正如Jim Brissom所说,
alloca
是不可移植的


您不需要
删除
。当函数返回时,内存将被释放。

有一种方法,它非常有限,非常不正常。您需要创建一个静态大小的
无符号字符数组,该数组构成一个内存池。对象列表的大小将受到限制。您需要为该类重载一个
new
操作符(和
delete
操作符),以便专门针对这样的内存池


也就是说,没有什么好的理由走这条路。

有一种方法,它非常有限,非常不正统。您需要创建一个静态大小的
无符号字符数组,该数组构成一个内存池。对象列表的大小将受到限制。您需要为该类重载一个
new
操作符(和
delete
操作符),以便专门针对这样的内存池


也就是说,没有很好的理由走这条路。

好吧,如果你不想使用堆上的内存,你还想从哪里获得它

a) 取决于系统-您可以要求操作系统为您分配一些内存。但这是糟糕的风格(取决于系统),将使用相同的RAM。。。只是以不同的方式分配。例如,如果您确实有兴趣这样做,Windows 32中的:::GlobalAlloc或::LocalAlloc将执行这些操作

b) 内存映射文件——如果你问这个问题,可能会很有趣,因为你认为你没有足够的可用RAM,访问时间也不是问题

c) 求助于c函数,比如malloc/free并转换指针。。。这就是从堆中获取内存,只是避免使用“new”和“delete”关键字

但是,如果不知道为什么要避免新建/删除,就很难说出什么是“好”的解决方案。 您需要动态内存分配,这两个是实现这一点的工具


请您解释/重新表述您的问题,以便获得更准确的答案?

好吧,如果您不想使用堆上的内存,您还想从哪里获得它

a) 取决于系统-您可以要求操作系统为您分配一些内存。但这是糟糕的风格(取决于系统),将使用相同的RAM。。。只是以不同的方式分配。例如,如果您确实有兴趣这样做,Windows 32中的:::GlobalAlloc或::LocalAlloc将执行这些操作

b) 内存映射文件——如果你问这个问题,可能会很有趣,因为你认为你没有足够的可用RAM,访问时间也不是问题

c) 求助于c函数,比如malloc/free并转换指针。。。这就是从堆中获取内存,只是避免使用“new”和“delete”关键字

但是,如果不知道为什么要避免新建/删除,就很难说出什么是“好”的解决方案。 您需要动态内存分配,这两个是实现这一点的工具


请解释/重新表述您的问题,以便获得更准确的答案?

有一种特殊的方法,可以使用new在堆栈中分配内存,或者使用所谓的placement new操作符作为静态存储。在这个版本的new中,您保留了一块内存,并显式地告诉new要将特定变量存储在哪里。其工作如下:

   #include <new>
   int main()
   {
      char buffer[500];  // chunk of memory
      int p*;
      p = new (buffer) int[10];
   }
#包括
int main()
{
字符缓冲区[500];//内存块
int p*;
p=新(缓冲区)整数[10];
}
请注意,为了使用此特殊的新运算符,您需要包括新标题。在这种情况下,当您使用自动存储时,内存将在离开声明它的块(main)时被释放


<参考文献:C++ +引物+。第九章。第420页

有一种特殊的方法可以使用new在堆栈中分配内存,或者使用所谓的placement new操作符作为静态存储。在这个版本的new中,您保留了一块内存,并显式地告诉new要将特定变量存储在哪里。其工作如下:

   #include <new>
   int main()
   {
      char buffer[500];  // chunk of memory
      int p*;
      p = new (buffer) int[10];
   }
#包括
int main()
{
字符缓冲区[500];//内存块
int p*;