新增了多less字节?

可能重复:
如何获得malloc后的内存块的长度?

如果我有一个指针,是否有可能知道有多less字节被new分配? 当我_msize()我find了Windows的解决scheme: _msize()和Mac: malloc_size() 。 但是没有任何的Linux。

如果没有,是否有人知道为什么程序员隐藏了它? delete应该肯定知道这样的信息。

更新:

据我所知,如果我有这个代码:

  class A { ~A() {} int m_a; }; class B : public A { ~B() {} int m_b; }; int main() { A * b = new B(); delete b; return 0; } 

A的析构函数将会被调用,但是new所有内存都将被释放。 这意味着它可以以某种方式计算只知道指针。 那么从程序员那里隐藏的原因是什么呢?

不幸的是,没有获得由newmalloc分配的字节数的便携方式。 有这么几个原因:

  • 在某些平台上, deletefree什么也不做。 因此,他们不需要存储大小信息。 这在嵌入式平台中是非常常见的。 它可以让你使用为其他平台编写的C或C ++代码不变,只要你不要做太多的分配。
  • 即使在更常见的平台上,系统也可能会分配不同数量的字节。 通常情况下,您的分配将与一些较大的尺寸对齐 – 可能比您的原始请求大得多。 存储元数据也可能存储在一个非常慢的数据结构中 – 您不希望在时间关键的代码中占用锁并访问哈希表。

作为可移植的语言,C和C ++不能提供在每个平台上都不可用(或定义明确或相当快)的功能。 这就是为什么在C ++上不可用。 也就是说,你不需要这个std::vector ++提供了std::vector ,它可以跟踪你的分配的大小,或者std::string来处理所有这些细节。

new运算符所做的是调用构造函数,因此分配的大小取决于您所调用的构造函数的类型。

例如

 class A { private: int* x; public: A() { x = new int [100]; } }; 

将分配sizeof(int) * 100但你不知道如果A的实现是隐藏的。

如果你执行自己:

 int * x = new int [100]; 

那么你知道你有多少分配,因为有访问sizeof(primitive)

而且, delete操作调用一个析构函数,所以对于复杂的对象,它不需要知道分配内存的大小,因为完全正确地释放内存的责任完全委托给程序员。

所以这里没有一个简单的答案。

newmalloccalloc和所有其他与语言相关的堆相关的分配(是的,还有比这更多的)将至少分配您请求的内存量。 他们可能会分配更多( 一般来说他们会分配更多)。

没有便捷的方法来知道他们分配了多少。 事实上,除非你确切知道你正在使用的堆管理器,否则根本没有办法。

你还需要从内存的意义上区分分配的内存,你可以从返回的指针安全地访问(这就是malloc_size在mac上返回的内容,可能是什么_msize返回在窗口上)从实际内存中'从堆中拿走',因为分配(其中包括可能与您分配的内存块相邻或不相邻的簿记信息,对于相同大小的分配可能相同也可能不相同)。

Q:那么我可以查询malloc包来找出分配的块有多大?

答:不幸的是,没有标准或便携的方式。 (有些编译器提供非标准的扩展。)如果你需要知道,你必须自己跟踪它。

C-FAQ

除了上面的答案之外:在某些情况下,必须分配和释放的大小在编译时已知,并且在某个地方记录大小,这将是一个完整的内存空间。

在静态类型等于动态类型的情况下,可以通过类型来确定要被释放的内存。

在静态类型不等于动态类型的情况下,删除的对象类必须具有虚拟析构函数。 这个析构函数可以用来释放正确大小的内存。

分配一个数组时,数组的大小通常以实现依赖的方式附加到该数组,并且要被释放的大小可以由元素的类型和数组的大小来确定。

  X x=new X() 

这里它取决于类的大小,即变量类包含数量

 int x = new int [100]; 

这里取决于你要分配多少个元素。假设int需要2个字节,那么这里需要200个字节。
简而言之,我们可以说, 这取决于数据类型 ,为此我们使用新的运算符