可能重复:
如何获得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
所有内存都将被释放。 这意味着它可以以某种方式计算只知道指针。 那么从程序员那里隐藏的原因是什么呢?
不幸的是,没有获得由new
和malloc
分配的字节数的便携方式。 有这么几个原因:
delete
和free
什么也不做。 因此,他们不需要存储大小信息。 这在嵌入式平台中是非常常见的。 它可以让你使用为其他平台编写的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
操作调用一个析构函数,所以对于复杂的对象,它不需要知道分配内存的大小,因为完全正确地释放内存的责任完全委托给程序员。
所以这里没有一个简单的答案。
new
, malloc
, calloc
和所有其他与语言相关的堆相关的分配(是的,还有比这更多的)将至少分配您请求的内存量。 他们可能会分配更多( 一般来说他们会分配更多)。
没有便捷的方法来知道他们分配了多少。 事实上,除非你确切知道你正在使用的堆管理器,否则根本没有办法。
你还需要从内存的意义上区分分配的内存,你可以从返回的指针安全地访问(这就是malloc_size在mac上返回的内容,可能是什么_msize返回在窗口上)从实际内存中'从堆中拿走',因为分配(其中包括可能与您分配的内存块相邻或不相邻的簿记信息,对于相同大小的分配可能相同也可能不相同)。
Q:那么我可以查询malloc包来找出分配的块有多大?
答:不幸的是,没有标准或便携的方式。 (有些编译器提供非标准的扩展。)如果你需要知道,你必须自己跟踪它。
C-FAQ
除了上面的答案之外:在某些情况下,必须分配和释放的大小在编译时已知,并且在某个地方记录大小,这将是一个完整的内存空间。
在静态类型等于动态类型的情况下,可以通过类型来确定要被释放的内存。
在静态类型不等于动态类型的情况下,删除的对象类必须具有虚拟析构函数。 这个析构函数可以用来释放正确大小的内存。
分配一个数组时,数组的大小通常以实现依赖的方式附加到该数组,并且要被释放的大小可以由元素的类型和数组的大小来确定。
X x=new X()
这里它取决于类的大小,即变量类包含的数量 。
int x = new int [100];
这里取决于你要分配多少个元素。假设int需要2个字节,那么这里需要200个字节。
简而言之,我们可以说, 这取决于数据类型 ,为此我们使用新的运算符